Java位运算
位运算符
运算符 | 功能 | 是否包括符号位 |
---|---|---|
& | 按位与 | 1 |
| | 按位或 | 1 |
~ | 按位非 | 1 |
^ | 按位异或 | 1 |
<< | 位左移 | 1 |
“>>” | 位右移 | 1 |
“>>>” | 无符号右移 | 0 |
位移操作说明
位左移
将操作数二进制整体左移指定位数,后空出位置补0,符号位被顶出去。每次左移一次就相当于乘以2,前提在不溢出的情况下
举例:
int a = 0b01000000000000000000000000000001 << 2;
System.out.println(Integer.toBinaryString(a)); // output:100 说明前面都是0,也就是符号位被顶了出去
位右移
整体右移,左面空出的位置补上符号位。每次右移一次就相当于除以2。前提在不是32个1或者32个0的情况下。否则无论右移多少次,真值都不会改变的。
举例:
int a = 0b10000000000000000000000000000000 >> 1;
System.out.println(Integer.toBinaryString(a)); // output: 11000000000000000000000000000000
无符号右移
整体右移,但左边空出的位置置为0,最高位符号位不动
int a = 0b10000000000000000000000000000010 >>> 1;
System.out.println(Integer.toBinaryString(a));// output: 1000000000000000000000000000001
其他注意事项
- 对于低于int类型(如byte、short、char)的操作数总是先自动类型转换为int类型后,即带符号扩展为32位后再移位
- 对于int类型的整数移位a>>b,当b>32时,系统先对b = b % 32;然后再进行位移。也就是a >> 33 和 a >> 1 的效果相同。
- 对于long同理,位移数大于64时,先mod 64然后位移。