C语言中,提供了用于二进制位操作的运算符以及复合运算符对程序设计中的位运算提供支持,见表11.1。表11.1C语言中的位运算符1.按位与运算符(&)按位与运算符(&)是一个双目运算符,其功能是:将参加操作的两个对象的各个二进制位分别对应进行“与”运算,即:两者都为1时结果为1,否则结果为0。例如,把整型变量a的低16位置1,保留高16位,可以通过对变量a施加a|0xffff运算实现。按位异或运算示例。......
2023-11-20
前面章节介绍的运算都是基于数据对象作为整体对待的基础上进行的,当需要编写对系统的软硬件进行控制的程序时,经常要求对二进制位进行处理。利用C语言提供的位运算功能,可以开发出一些直接对存储器、外部设备等进行操作的程序。下面的程序示例给出了位运算的一些简单应用。
【例11.10】 编写程序实现功能:不用临时变量交换两个整型变量的值。
根据二进制位异或运算的规则,对于任意两个整数x和y,则有等式y=y^x^x一定成立,上面程序正是利用位异或运算的这一性质实现数据交换的。
【例11.11】 编写程序实现功能:利用二进制位运算进行十进制整数到二进制数的转换。
从数的进制以及进制之间的转换原理上说,十进制整数到二进制数的转换可以使用“除2取余法”。从前面的介绍得知,对整型数据而言在系统存储器中存储的是其二进制补码形式。如果被转换的十进制数是正数,则其补码与其原码相同,转换时只需要判断出最高位(符号位)以外的所有二进制位,二进制位值为1时输出1,二进制位值为0时输出0即可得到转换后的二进制数据。如果被转换的十进制数是负数,首先单独处理数据符号位,然后将其在存储器中的数据转换为对应的原码后再按处理正整数的方法进行处理即可。实现利用二进制位运算进行十进制整数到二进制数的转换的C程序如下:
在程序中,为了保证在不同位数开发环境(例如,16位系统或者32位系统)中都能够按正确的二进制位数输出,设计并定义了函数getwordlen,函数getwordlen的功能是测试出当前所用的系统环境的字长是多少位,然后用该字长控制二进制转换的长度,下面是程序两次执行的过程和输出的结果:
请输入要转换的数据:12345//第一次执行输入正整数测试
12345的二进制码为:0000000000000000011000000111001
请输入要转换的数据:-12345//第二次执行输入负整数测试
-12345的二进制码为:-0000000000000000011000000111001
【例11.12】 函数moveRightLeft的原型是:short int moveRightLeft(short int num,short int k),其功能是把num循环位移k位,若k>0表示右移,k<0表示左移。编写函数moveRightLeft,并编写主函数进行测试。
对于一个short int类型的数据,循环左移n位,相当于循环右移16-n位,根据这一点,上面程序中把循环左移转换成了循环右移。下面是程序两次执行的过程和输出结果:(www.chuimin.cn)
请输入要移动的数据:5 //第一次执行时的输入和输出
请输入要移动的位数:2
移动前的二进制码为:00000000 00000101
右移2位
移动后的二进制码为:01000000 00000001
请输入要移动的数据:-5//第二次执行时的输入和输出
请输入要移动的位数:-2
移动前的二进制码为:11111111 11111011//-5的补码
左移2位
移动后的二进制码为:11111111 11101111
有关C语言程序设计基础(第3版)的文章
C语言中,提供了用于二进制位操作的运算符以及复合运算符对程序设计中的位运算提供支持,见表11.1。表11.1C语言中的位运算符1.按位与运算符(&)按位与运算符(&)是一个双目运算符,其功能是:将参加操作的两个对象的各个二进制位分别对应进行“与”运算,即:两者都为1时结果为1,否则结果为0。例如,把整型变量a的低16位置1,保留高16位,可以通过对变量a施加a|0xffff运算实现。按位异或运算示例。......
2023-11-20
可以使用typedef为结构体数据类型取一个方便程序中使用的别名。用typedef构造指定行数和列数的二维数组类型。用typedef构造指针数据类型。......
2023-11-20
sizeof运算符的功能是返回其所测试的数据对象所占存储单元的字节数。例如,sizeof的值为1。使用sizeof运算符时需要注意以下两点:①使用sizeof运算符的目地是获取任何数据对象所占内存单元的字节数,使得程序自适应于所用系统的存储分配机制。②如果被测试的对象是一个表达式,sizeof不会对表达式进行具体的运算,而只是判断该表达式的最终数据类型,并以此求出所需要的存储空间。sizeof运算符示例。......
2023-11-20
C语言中逻辑运算符及其含义见表3.2。表3.2逻辑运算符及其含义逻辑运算符“&&”和“||”是双目运算符,具有左结合性;“!”表3.3逻辑运算真值表C语言中进行逻辑表达式求值运算时,不但要注意逻辑运算符本身的运算规则,而且还必须要遵循下面的两条原则:·对逻辑表达式从左到右进行求解。......
2023-11-20
图5.7两层函数嵌套调用示意图函数的嵌套调用即一个函数在被调用的过程中又调用了另外的一个函数。函数fac和powers的返回值类型均被设计为double型,其主要目的是为了避免n!x:0.5//0.5从键盘输入的数据0.50 powers of e=1.648721//程序执行结果......
2023-11-20
下面介绍6 种位运算符的运算与应用。在进行位运算之前,需把参加位运算的对象的值转换为二进制数。例如:4.按位与运算按位与运算符(&)将其两边数据对应的二进制位按位进行与运算。清零,即使全部二进制位置为0,只要找一个二进制数,其中各个位符合条件:原来的数中为1 的位,新数中相应的位为0,其他位不考虑,然后使二者进行&运算,即可达到清零的目的。图8.1进制转换程序运行结果......
2023-10-21
针对不同的实际应用,数据排序方法有很多种。本节介绍两种常用排序方法的基本思想和实现方法,帮助读者初步理解排序方法的计算机解决思路。②不考虑已排好序的数据,将剩下的数据作为待排序列。编写程序实现冒泡排序算法,对随机生成的10个3位整数按升序进行排序并输出。......
2023-11-20
一个函数直接或间接地调用自己,称为函数的递归调用。所以函数递归调用的实现必须依靠系统提供一个特殊部件(堆栈)存放未完成的操作,以保证当递归调用结束回溯时不会丢失任何应该执行而没有执行的操作。为了理解函数递归调用的特性,参照例5.9的程序讨论函数递归调用的执行过程,为了讨论方便为程序加上行号。函数递归调用示例。......
2023-11-20
相关推荐