梦想永不止步

c语言中的位级运算

GaGa:

C语言具有位逻辑运算和移位运算的独特功能,参与位运算的运算量必须是整数。位逻辑运算包括&、|、∧、~四种运算,移位运算有<<、>>两种运算。其中~为单目运算符。


一、位逻辑运算:


1.“&”:按位与。参与运算的量,如果相对应的两位(二进制表示)都为1,则该位的结果值为1,否则为0,即:


0&0==0       0&1==0      1&0==0     1&1==1


如:


int a=10,b=6,c= a & b;


即:


a:00000000 00000000 00000000 00001010


b:00000000 00000000 00000000 00000110


c:00000000 00000000 00000000 00000010


所以,c=2。.


2.“|”:按位或。参与运算的量,如果相对应的两位(二进制表示)都为0,则该位的结果值为0,否则为1,即:


0|0==0       0|1==1      1|0==1     1|1==1


如:


int a=10,b=6,c= a | b;


即:


a:00000000 00000000 00000000 00001010


b:00000000 00000000 00000000 00000110


c:00000000 00000000 00000000 00001110


所以,c=14。.


3.“^”:按位异或。参与运算的量,如果相对应的两位(二进制表示)相异,则该位的结果为1,否则为0,即:


0∧0==0       0∧1==1      1∧0==1     1∧1==0


如:


int a=10,b=6,c= a ^ b;


即:


a:00000000 00000000 00000000 00001010


b:00000000 00000000 00000000 00000110


c:00000000 00000000 00000000 00001100


所以,c=12。.


4.“~”:按位取反(单目运算符)。将参与运算量的相对应位(二进制表示)的值取反,即1变0,0变1。


如:


int a=10,c= ~a;


即:


a:00000000 00000000 00000000 00001010


取反:11111111 11111111 11111111 11110101(该数为负数,此二进制为其补码,应求其原码形式)


原码:10000000 00000000 00000000 00001011(符号位不变,补码的反码再加1)


即-11。


所以,c=-11。.


二、移位运算:


1.“<<”:按位左移。将一个运算量的各位(二进制表示)依次左移若干位,低位补0,高位舍弃不要。注意:位移操作的右操作数必须小于左操作数的位长度,否则结果未定义。


如:


int a=10,c= a<<2;


即:


a:00000000 00000000 00000000 00001010


c:00000000 00000000 00000000 00101000


所以,c=40。


2.“>>”:按位右移。将一个运算量的各位(二进制表示)依次右移若干位,低位被移出,高位对无符号数补0,对有符号数要按最高符号位自身填补(即右移后符号不变)。注意:位移操作的右操作数必须小于左操作数的位长度,否则结果未定义。


如:


int a=-10,c= a>>2;


即:


a:00000000 00000000 00000000 00001010


a的补码:11111111 11111111 11111111 11110110


c的补码:11111111 11111111 11111111 11111101


c的原码:10000000 00000000 00000000 00000011


所以,c=-3。


3.移位运算的算数规律:在一定的取值范围内(高位不能移出二进制数的有效数字1),将一个整数(无论是正数还是负数)左移1位相当于乘以2;右移运算没有取值范围的限定,但有正负数之别。对于正数,右移1位相当于除以2,小数部分截掉;对于负数,右移1位相当于除以2;小数部分四舍五入。由于计算机做移位比做乘法快得多,编译器可以利用这一点进行优化。


三、位运算的复合赋值运算符:&=(位与赋值)、|=(位或赋值) 、∧= (位异或赋值) 、>>=(按位右移赋值)、<<= (按位左移赋值)。


如a>>=2等价于a=a>>2。

评论
热度(12)

© ID488257875 | Powered by LOFTER