C语言中的位运算

来源:互联网 发布:sql rownum用法 编辑:程序博客网 时间:2024/04/28 13:00
   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。

0 0
原创粉丝点击