说了几个简单的位运算符, 接下来看看稍微复杂点的另外三个吧:
<<:
将操作数的二进制码整体左移指定位数, 左移之后的空使用 0 来补充刚接触这个所谓的移位操作, 不一定能理解二进制码整体移动指定位数是什么意思, 所以下面用代码直观地表示一下:
System.out.println(2 << 3);// 表示 2 的二进制码整体左移 3 位, 结果为 16
2 的二进制: 00000000_00000000_00000000_00000010
移位后的二进制: 00000_00000000_00000000_00000010
左移之后, 右端缺少 3 位, 使用 0 来补充空位, 结果如下:
16 的二进制: 00000_00000000_00000000_00000010000
>>:
将操作数的二进制码整体右移指定位数, 右移之后的空使用符号位来补充同样地也以代码来解释:
System.out.println(16 >> 3);// 表示 16 的二进制代码整体右移 3 位, 结果为 2
16 的二进制: 00000_00000000_00000000_00000010000
移位后的二进制: 00000_00000000_00000000_00000010
右移之后, 左端缺少 3 位, 使用符号位 (正数为 0, 负数为 1) 来补充空位, 结果如下:
2 的二进制: 00000000_00000000_00000000_00000010
>>>:
将操作数的二进制码整体右移指定位数, 右移之后的空位使用 0 来补充 (注意: 没有<<<!!!) 这个操作其实和>>一样, 只是无论操作的数为正或负, 均使用 0 来补充空位
System.out.println(-16 >>> 3);// 表示 - 16 的二进制码整体右移 3 位, 结果为 536870910
-16 的二进制: 11111111_11111111_11111111_11110000
移位后的二进制: 11111111_11111111_11111111_11110
右移三位之后, 左端空缺三位, 需要用 0 来补充, 结果如下:
536870910 的二进制: 00011111111_11111111_11111111_11110
来源: http://www.bubuko.com/infodetail-2502858.html