>> 右移
右移, 道在二进制中, 假设用一个 32 位的 Int 表示一个 64, 那么高位就都是 0, 所以当我们把整个二进制数右移, 如 0100000>> 2 = 0001000, 可以看到右移两位后的数变成了 8, 可以分析出其实右移就是一个除以 2 的操作
例: 对于非 2,4,8,16,64 的数也可以试验一下:
- System.out.println(3>> 1);
- System.out.println(5>> 1);
- System.out.println(63>> 1);
其结果分别为 1,2,31.
所以右移就是一个整除 2 的过程, 右移一位就是除一次, n 位就是除 n 次.
同时需要注意的 >> 是带符号的, 也就是说它的高位补充数是由最高位来决定的, 正数的最高位为 0, 负数的最高位为 1, 所以负数 >> 后还是负数.
另例:
- System.out.println(5>>1);
- System.out.println(63>>1);
- System.out.println(63>>2);
- System.out.println(63>>3);
结果:
2 31 15 7
可以看出 >>1 则除以 2,>>2 则除以 2 在除以 2. 后面以此类推
>>> 无符号右移
原理和上面一样, 不同的是它的高位总是由 0 来补充.
- System.out.println(3>>> 1);
- System.out.println(5>>> 1);
- System.out.println(64>>> 1);
- System.out.println(63>>> 1);
- System.out.println(-63>>> 1);
结果分别是:
- 1
- 2
- 32
- 31
- 2147483616
由此可看出 >>> 符号在计算正数时与 >> 符号一样, 而如果为负数时则移动位置变化
因为 - 64 在计算机中的存在为: 11111111111111111111111111000000, 那么无符号右移一位就变成了 01111111111111111111111111100000, 这个值等于 2147483616
所以对于这些位运算不要用惯性思维去思考, 一定要想明白二进制是如何工作的.
<< 左移
- System.out.println(-64 << 1);
- System.out.println(64 << 1);
- System.out.println(25 << 1);
结果是 - 128,128,50, 显然是乘 2 的.
左移后低位是由 0 来补充的
3<<3 表示 3 乘 2 的三次方
因为将一个数左移 n 位, 就相当于乘以了 2 的 n 次方
JAVA 中没有 <<< 的, 因为左移后低位肯定是由 0 来补充的
来源: http://www.bubuko.com/infodetail-2548975.html