较为复杂の位运算符:
''<<'':左移 左边最高位丢弃,右边补齐0
'>>':右移 最高位是0,左边补齐0;最高为是1,左边补齐1
'>>>':无符号右移 无论最高位是0还是1,左边补齐0
举例:
class OperatorDemo3 {
public static void main(String[] args) {
System.out.println(3 << 2);
System.out.println(-24 >> 2);
System.out.println(-24 >>> 2);
}
}
3 << 2:
计算出3的二进制:11
00000000 00000000 00000000 00000011
000000 00000000 00000000 0000001100
结果:12
-24 >> 2:
计算出24的二进制:11000
原码:10000000 00000000 00000000 00011000
反码:11111111 11111111 11111111 11100111
补码:11111111 11111111 11111111 11101000
补码的运算:
11111111 11111111 11111111 11101000
11111111 11111111 11111111 11111010(00)
补码:1111111111 11111111 11111111 111010
反码:1111111111 11111111 11111111 111001
原码:1000000000 00000000 00000000 000110
结果:-6
-24 >>> 2:
计算出24的二进制:11000
原码:10000000 00000000 00000000 00011000
反码:11111111 11111111 11111111 11100111
补码:11111111 11111111 11111111 11101000
11111111 11111111 11111111 11101000
0011111111 11111111 11111111 111010(00)
结果:1073741818
内存中的所有运算,都要换成补码运算,正数的补码和原码一致,但负数的补码与原码大相庭径!需注意。
面试题:
请用最有效率的方式写出计算2乘以8的结果?
2 × 8 = 2 × 2^3
2 << 3
举一反三:任何数乘以2的n次方,都可以用左移运算符来快速计算。
3 × 64 = 3 × 2^6
3 << 6
.
.