34

重複の可能性:
(-1 >>> 32)= -1であるのはなぜですか?

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

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

出力

11

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

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

出力

11111111111111111111111111111111

0にすべきではありませんか?

4

1 に答える 1

51

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

于 2013-01-24T12:49:31.380 に答える