web-dev-qa-db-ja.com

Javaの符号なし右Shift '>>>'演算子

可能性のある複製:
(-1 >>> 32 -1?)==

符号なし右シフト演算子は、左端に0を挿入します。だから私がするとき

System.out.println(Integer.toBinaryString(-1>>>30))

出力

11

したがって、左端のビットに0を挿入しています。

System.out.println(Integer.toBinaryString(-1>>>32))

出力

11111111111111111111111111111111

0であってはいけませんか?

34
Sashwat

http://docs.Oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.19 を参照してください

左側のオペランドの昇格されたタイプがintの場合、右側のオペランドの最下位5ビットのみがシフト距離として使用されます。これは、右側のオペランドがマスク値0x1f(0b11111)でビット単位の論理AND演算子&(§15.22.1)を受けた場合と同じです。したがって、実際に使用されるシフト距離は、常に0〜31の範囲にあります。

つまり、-1 >>> 32-1 >>> 0と同等であり、-1 >>> 33-1 >>> 1と同等です。特に混乱を招くのは、-1 >>> -1-1 >>> 31と同等です

48