1.按位与(&)
int a = 3, b = -2 , c = a & b ;
3&-2结果:2
2.按位或(|)
int a = 3, b = -2 ,
3|-2结果:-1
3.按位异或(^)
int a = 3, b = -2 , c = a ^ b ;
3^-2结果:-3
4.按位取反(~)
int a=18, b = ~ a;
~2结果:-3
5.左移(<<)
<< :左移 左边最高位丢弃,右边补齐0
在数字没有溢出的前提下,对于正数和负数,左移一位都相当于乘以2的1次方,左移n位就相当于乘以2的n次方
32>>3结果:4
用来将一个数的各二进制位全部左移若干位,移动的位数由右操作数指定,右操作数必须是非负值,其右边空出的位用0填补,高位左移溢出则舍弃该高位。
左移表达式的的位 result = expression1 << expression2
参数 result,任何变量。
expression1,任何表达式,需要移位的数字。
expression2,任何表达式,移位的次数。
用来将一个数的各二进制位全部左移若干位。例如:
将a的二进制数左移2位,右补0。若a=15,即二进制数00001111,左移2位得00111100,即十进制数60(为简单起见,用8位二进制数表示十进制数15,如果用左移运算符16位二进制数表示,结果是一样的)。
高位左移后溢出,舍弃。
左移一位相当于该数乘以2,左移2位相当于该数乘以2^2=4。上面举的例子15<< 2=60,即乘了4。但此结论只适用于该数左移时被溢出舍弃的高位中不包含1的情况。
例如,假设以一个字节(8位)存一个整数,若a为无符号整型变量,则a=64,即二进制数01000000时,左移一位时溢出的de是0。而左移2位时,溢出的高位中包含1,则不符合上述结论。
由下表可以看出,若a的值为64,在左移一位后相当于乘2,左移2位后,值等于256。
简单介绍一种方便计算的方法:
8 << 1的值为8*2=16;
8 << 2的值为8*(2^2)=32;
8 << n的值为8*(2^n)。
数学意义:
在数字没有溢出的前提下,对于正数和负数,左移一位都相当于乘以2的1次方,左移n位就相当于乘以2的n次方。
6.右移(>>)
>> :右移 最高位是0,左边补齐0;最高为是1,左边补齐1
右移一位相当于除2,右移n位相当于除以2的n次方。
2<<3结果:16
右移有两种:
1、逻辑右移:丢弃最低位,向右移位,左边空出来的位置补0
2、算术右移:丢弃最低位,向右移位,左边空出来的位置补原来的符号位(即补最高位)