9.1 位运算概念及运算符
所有数据在计算机中都是用二进制位(bit)表示的。C语言既具有高级语言的特点,也具有低级语言的特点,能够对二进制数进行位运算,可以像汇编语言一样进行系统编程。对二进制位进行的运算称为“位运算”,具体由位运算符和操作数实现。
大多数系统中,用8位二进制数表示一个字节,它是一个char型变量的标准存储单位,其他的类型如整型数要用两个字节存储,下面介绍的位运算符是用于unsigned型的整数,若整数的高8位是0,可以只表示低8位。
C语言提供了6种位运算符,见表9-1。
表9-1
表9-1列出了位运算符的名称和含义,同时它们在表中从上到下的顺序也是运算符优先级由高到低的顺序表示。下面对这些运算符的计算方式分别进行描述。
1.按位与运算符(&)
功能是参加运算的两操作数,按二进制位进行“与”运算。如果两个相应的二进制位都为1,则该位的结果值为1,否则为0。即
0&0=0;0&1=0;1&0=0;1&1=1
例如:9&5并不等于45,应该是按位与。
所以9&5的值是1。
根据按位与运算符的运算性质,通常用来进行清0或保留某些位的运算。
例如:操作数a的值是1001101000101011,要将此数的高8位清0,低8位保留。解决办法就是和0000000011111111进行按位与运算。
从运算结果中看出,操作数a的高8位与0进行‘&’运算后,全部变为0,由‘&’运算的性质决定。同时操作数a的低8位与1进行‘&’运算时,根据1&0=0,1&1=1运算性质而得出的结果是与原数相同的。
2.按位或运算符(|)
其功能是参加运算的两个操作数的对应二进制位进行或运算。两个相应的二进制位中只要有一个为1,该位的结果值就为1。即0|0=0,0|1=1,1|0=1,1|1=1。
例如:9|5的值为13
根据按位或运算符的运算性质,可进行将操作数的某几位设定为1的运算。例如:将操作数9的高4位改为1,低4位不变。那么就与11110000进行按位或运算。
3.按位异或运算符(∧)
按位异或运算符,它的运算规则是当参加按位异或运算的两操作数的对应位不同时,结果为1,相同时结果为0。即
00=0∧,01=1∧,10=1∧,11=0∧。
例如:95∧的值是12
根据按位异或运算符的运算性质,可作如下应用:
有操作数10110101,将其高4位保留,低4位翻转,即1变为0,0变为1。那么将它与00001111进行∧运算,即
得出保留原值的结果,这是因为原数中的1与0进行∧运算得1,00∧得0,故保留原数。得到翻转的值,是因为1与1进行∧运算得0,10∧得1,故得此值。
4.按位取反运算符(~)
按位取反“~”是单目运算符,功能是用来对一个二进制数按位取反,即将0变1,1 变0。例如:对操作数9(即二进制00001001)进行按位求反:
因此,~9的值为246。
5.左移运算符(<<)
功能是把“<<”左边的操作数的各二进位全部左移若干位,由“<<”右边的数指定移动的位数,低位空缺处补0。
例如:a的值为9,进行运算a<<1,a<<2:
左移运算比较简单,容易掌握。实际上在没有溢出的情况下,左移运算可以很方便地实现有符号数和无符号数乘2 n 的运算(n为移位次数),即左移1位相当于乘2,左移2位相当于乘4,左移n位相当于乘2 n 。但是需要强调的是,不是所有的左移运算都是乘2 n 的,例如:
这次的运算结果就不是乘22的,因为移出的高位中含有1,这样就产生了溢出,所以大家计算时需谨慎使用。
6.右移运算符(>>)
右移运算符与左移运算符相似,功能是把“>>”左边的操作数的各二进位全部右移若干位,由“>>”右边的数指定移动的位数,高位空缺处补0,移出的低位被舍弃。
例如:a的值为39,进行运算a>>2:
注意:
(1)操作数是有符号负数,即最高位为1时,进行右移后高位空缺处要补1,否则高位空缺处补0。
(2)右移运算可以很方便地实现有符号数除2 n 的运算(n为移位次数),即右移1位相当于除2,右移2位相当于除4,右移n位相当于除2 n 。
7.位运算赋值运算符
&=,|=,<<=,<<=,=∧,这些就是位运算符与赋值运算符组合成的位运算赋值运算符。它与复合的赋值运算符类似。例如:
a&=b相当于a=a&b
a<<=2相当于a=a<<2
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。