可能性のある複製:
(-1 >>> 32 -1?)==
符号なし右シフト演算子は、左端に0を挿入します。だから私がするとき
System.out.println(Integer.toBinaryString(-1>>>30))
11
したがって、左端のビットに0を挿入しています。
System.out.println(Integer.toBinaryString(-1>>>32))
11111111111111111111111111111111
0であってはいけませんか?
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
と同等です