首页 理论教育C语言程序设计实用教程:位运算符的应用与实例

C语言程序设计实用教程:位运算符的应用与实例

【摘要】:下面介绍6 种位运算符的运算与应用。在进行位运算之前,需把参加位运算的对象的值转换为二进制数。例如:4.按位与运算按位与运算符(&)将其两边数据对应的二进制位按位进行与运算。清零,即使全部二进制位置为0,只要找一个二进制数,其中各个位符合条件:原来的数中为1 的位,新数中相应的位为0,其他位不考虑,然后使二者进行&运算,即可达到清零的目的。图8.1进制转换程序运行结果

下面介绍6 种位运算符的运算与应用。在进行位运算之前,需把参加位运算的对象的值转换为二进制数。

1.按位取反运算

按位取反(~)是位运算中唯一的一个单目运算符,运算对象置于运算符的右边,其运算功能是把运算对象的内容按位取反,即每一位上的0 变1、1 变0。例如:

a=00011010, ~a=11100101

2.左移运算

左移运算符(<<)用于将一个数的各个二进制位全部向左平移若干位(左边移出的部分忽略,右边补0)。

若a=15,即二进制数位00001111,执行语句a=a<<2,左移2 位得00111100,即十进制数60。

左移1 位相当于该数乘以2,左移2 位相当于该数乘以4,但此结论只适用于该数左移时被溢出舍弃的高位中不包含1 的情况。例如:

左移比乘法运算快得多,有些编译程序自动将乘以2 的运算用左移1 位来实现,将乘2n的幂运算处理为左移n 位。

3.右移运算

右移运算符(>>)用于将一个数的各个二进制位全部向右平移若干位(右边移出的部分忽略,左边对无符号数补0,有符号数补符号位)。

每右移1 位,相当于除2,右移n 位相当于除2n。例如:

4.按位与运算

按位与运算符(&)将其两边数据对应的二进制位按位进行与运算。与逻辑与运算规则一致,两者都为1 则结果为1,否则为0。例如:

结论:与1 按位与为1,那么该位为1;与1 按位与为0,那么该位为0。所以,与1 按位与可用于检测某个位是1 还是0。

按位与还可进行清零、取指定位、保留指定位等特殊用途。

清零,即使全部二进制位置为0,只要找一个二进制数,其中各个位符合条件:原来的数中为1 的位,新数中相应的位为0,其他位不考虑,然后使二者进行&运算,即可达到清零的目的。

取指定位,即取一个数中的某些指定位。若有一个整数a(2 字节)。想取其中的低字节数,只需将a 与(377)8 按位与即可。若想取两个字节中的高字节,只需a 与(177400)8 按位与 即可。

保留指定位,若想将哪一位保留下来,就与一个数进行&运算,此数在该位取1,其余位为0。

5.按位或运算

按位或运算符(|)将其两边数据对应的二进制位按位进行或运算。与逻辑或运算规则一致,二者只要有1 个为1 则结果为1;否则为0(两者都为0 时为0)。例如:(www.chuimin.cn)

结论:与0 按位或为1,那么该位为1;与0 按位或为0,那么该位位0。就是说任何位与0 按位或还是等于这一位(保持不变)。

按位或运算常用将一个数据的某些位定值为1。例如,a 是一个整数(16 位),有表达式a|0377,则低8 位值全为1,高8 位保持不变。

6.按位异或运算

按位异或运算(^)也称XOR 运算。将其两边数据对应的二级制位按位进行异或运算,若二者相同,结果为0,若二者不同(相异),结果为1。例如:

结论:任何位与1 按位异或,等价于对该位取反。

异或运算符的应用:

(1)使用按位异或运算,可使特定位翻转。例如,假设有数0111 1010,想使其低4 位翻转,即1 变0,0 变1,可以将其与0000 1111 进行异或运算即可。

结果值的低4 位正好是原值低4 位的翻转。要使哪几位翻转就将其进行异或运算的哪几位置为1 即可。

(2)与0 异或,保留原值。

(3)交换两个值,不用临时变量

假如要将a 和b 的值交换,可以用以下赋值语句来实现。

【例8.1】使用位操作实现将一个十进制整数转换为二进制数输出。程序分析:

设置一个屏蔽字,其中只有一位为1,其余位为0,为1 的位为测试位。将此屏蔽字与被转换数进行按位与运算,根据运算结果判断被测试位是1 还是0。循环测试(一个整数2 个字节,16 位,测试16 次,从最高位开始测试,每次测试后屏蔽字右移1 位以便测试下一位)并输出测试结果就是整数对应的二进制数。

程序代码如下:

程序运行结果如图8.1 所示。

图8.1 进制转换程序运行结果