【位运算符介绍】
C语言具有位逻辑运算和移位运算的独特功能,参与位运算的运算量必须是整数。位逻辑运算包括&(按位与)、|(按位或)、^(按位异或)、~(取反)四种运算,移位运算有<<(左移)、>>(右移)两种运算。其中~位单目运算符。
【逻辑运算】
【 & (按位与)】
参与运算的量,如果相对应的两位都为1,则该位的结果值为1,否则为0,即:
0&0==0 0&1==0 1&0==0 1&1==1
如:a的值为0x1234,b的值为0x00,a&b运算的结果c应为:
a 0001 0010 0011 0100
& b 0000 0000 1111 1111
c 0000 0000 0011 0100
按位与常用于将某个运算量的某些位清0或提取某些位的值。
如上例子,将变量的高8位清0,同时保留或提取低8位的值,可用一个高8位为0,低8位为1的值0x00ff和它进行按位与。
【 | (按位或)】
参与运算的量,如果相对应的两位都为0,则该位的结果值为0,否则为1,即:
0|0==0 0|1==1 1|0==1 1|1==1
如:a的值为0x1234,b的值为0x00,a|b运算的结果c应为:
a 0001 0010 0011 0100
|b 0000 0000 1111 1111
c 0001 0010 1111 1111
按位或常用于将某个运算量的某些位置1,如本例中将变量的低8位置1,高8位不变,可用一个高8位为0,低8位为1的值0x00ff和它进行按位或。
【 ^ (按位异或)】
参与运算的量,如果相对应的两位相异,则该位的结果为1,否则为0,即:
0∧0==0 0∧1==1 1∧0==1 1∧1==0
如:a的值为0x1234,b的值为0x00,a∧b运算的结果c应为:
a 0001 0010 0011 0100
∧b 0000 0000 1111 1111
c 0001 0010 1100 1011
按位异或有“与1异或”该位翻转,“与0异或”该位不变的规律。如本例中用0x00ff进行按位异或,使变量a的低8位翻转,高8位不变。
【 ~ (取反)】
将参与运算量的相对应位的值取反,即1变0,0变1。
如:a的值为0x1234,~a运算的结果c应为:
a 0001 0010 0011 0100
c 1110 1101 1100 1011
【移位操作符】
【 << (左移)】
按位左移是将一个运算量的各位依次左移若干位,低位补0,高位舍弃不要。
假设机器字长为8位,变量a的值为16,将a左移二位,即a=a<<2:
左移前 0001 0000 左移后 0100 0000
由此看出,左移一位相当于该数乘2,左移二位相当于乘4,即22,但这要以该数左移之后不“溢出”为前提。
所谓“溢出”指该数已超过机器字长所能容纳的范围,如该例若继续左移二位,该数为16× 24=256,超出了字长8位的表示范围(257),即产生了溢出。
【 >> (右移)】
按位右移是将一个运算量的各位依次右移若干位,低位被移出,高位对无符号数补0,对有符号数要按最高符号位自身填补。
右移一位相当于该数除以2,但有可能带来误差。假设机器字长为8位,变量a值为15,将a右移二位,即a=a>>2:
右移前 0000 1111 右移后 0000 0011
如果a是带符号的负数,a=-16,存放在机器中的补码为1111 0000,则a=a>>2,值为- 4。
右移前 1111 0000 右移后 1111 1100
移位操作可用于整数的快速乘除运算,左移一位等效于乘2,而右移一位等效于除以2。