一、左移
<<
逻辑左移,右边补0,符号位和其他位一样移动。
在没有数字溢出的情况下,左移一位相当于✖️2的1次方,左移N位就相当于✖️2的n次方。
例如:
1 << 4
结果为:16
1 << 10
结果为:1024
3 << 10
结果为:3072,即为:3 x (1 << 10)
计算过程:
例如 1 二进制形式:
0000 0000 0000 0000 0000 0000 0000 0001
左移1位(1 << 1):
// 所有数字向左移动一位
// 最高位就相当于移除了,最后一位补0
0000 0000 0000 0000 0000 0000 0000 0010
结果为2(左移1位是2的1次方)。
左移2位(1 << 2):
0000 0000 0000 0000 0000 0000 0000 0100
结果为4(左移2位是2的2次方)。
二、右移
>>
右移,情况:
- 正数,高位补0
- 负数,高位补1
例如:
4 >> 1
4 的二进制为:
0000 0000 0000 0000 0000 0000 0000 0100
右移1位(正数,高位补0):
0000 0000 0000 0000 0000 0000 0000 0010
结果为:2
-4 >> 1
-4 的二进制为:
1111 1111 1111 1111 1111 1111 1111 1100
右移1位(负数,高位补1):
1111 1111 1111 1111 1111 1111 1111 1110
结果为:-2
右移1位就相当于一次➗2。
>>>
无符号右移,因为是无符号的,所以不管正数还是负数,高位都补0。
例如:
-4 >>> 1
-4 的二进制为:
1111 1111 1111 1111 1111 1111 1111 1100
无符号右移1位(高位补0):
01111 1111 1111 1111 1111 1111 1111 110
结果为:2147483646
查看数字的二进制形式:
System.out.println(Integer.toBinaryString(-4));
// 如果是正数,前面的0都会省略,例如 '4',输出结果就为 ‘100’