一、位逻辑运算:
1.“&”:按位与。参与运算的量,如果相对应的两位(二进制表示)都为1,则该位的结果值为1,否则为0,即:
0&0==0
如:
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
如:
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
如:
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。