搞懂了上篇文章,这篇就会比较容易。上篇文章传送门:搞懂原码、反码、补码
在 Java 中有三个位移运算:
- <<:左移
- >>:右移
- >>>:无符号右移
正数位移运算
首先来看结果:
十进制 2 转换为二进制原码、反码、补码都为 00000000 00000000 00000000 00000010
2 << 1
- 符号位固定不动,二进制左移一位,高位丢弃,低位补 0,结果为
00000000 00000000 00000000 00000100
- 其反码、原码都和该补码一样
- 换算成十进制为 4
2 >> 1:
- 符号位固定不动,二进制右移一位,低位丢弃,高位补 0,结果为
00000000 00000000 00000000 00000001
- 其反码、原码都和该补码一样
- 换算成十进制为 1
负数位移运算
首先来看结果:
十进制 -2 转换为二进制原码为 10000000 00000000 00000000 00000010
,反码为 11111111 11111111 11111111 11111101
,补码为 11111111 11111111 11111111 11111110
-2 << 1:
- 符号位固定不动,二进制左移一位,高位丢弃,低位补 0,结果为
11111111 11111111 11111111 11111100
- 该补码对应的反码为
11111111 11111111 11111111 11111011
- 该反码对应的原码为
10000000 00000000 00000000 00000100
- 换算成十进制为 -4
-2 >> 1:
- 符号位固定不动,二进制右移一位,低位丢弃,高位补 1,结果为
11111111 11111111 11111111 11111111
- 该补码对应的反码为
11111111 11111111 11111111 11111110
- 该反码对应的原码为
10000000 00000000 00000000 00000001
- 换算成十进制为 -1
无符号右移
首先来看结果:
前面 << 和 >> 都是符号位固定不动,而无符号右移则是符号位跟着一起右移。
十进制 2 转换为二进制补码为 00000000 00000000 00000000 00000010
;十进制 -2 转换为二进制补码为 11111111 11111111 11111111 11111110
2 >>> 1:
- 二进制符号位跟着右移,低位丢弃,高位补 0,结果为
00000000 00000000 00000000 00000001
- 其反码、原码都和该补码一样
- 换算成十进制为 1
-2 >>> 1:
- 二进制符号位跟着右移,低位丢弃,高位补 0,结果为
01111111 11111111 11111111 11111111
- 其反码、原码都和该补码一样
- 换算成十进制为 2147483647
无符号右移有个经典应用,在之前二分查找的文章中也说过,就是求两个整数的平均值:int mid = (l + r) >>> 1
位移运算,你搞懂了吗?