首页 理论教育C语言程序设计基础(第3版):位运算的简单应用

C语言程序设计基础(第3版):位运算的简单应用

【摘要】:下面的程序示例给出了位运算的一些简单应用。编写程序实现功能:不用临时变量交换两个整型变量的值。编写程序实现功能:利用二进制位运算进行十进制整数到二进制数的转换。如果被转换的十进制数是正数,则其补码与其原码相同,转换时只需要判断出最高位(符号位)以外的所有二进制位,二进制位值为1时输出1,二进制位值为0时输出0即可得到转换后的二进制数据。

前面章节介绍的运算都是基于数据对象作为整体对待的基础上进行的,当需要编写对系统的软硬件进行控制的程序时,经常要求对二进制位进行处理。利用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