2016-09-22 18 views
1

私はJavaで-1 >> 1を実行しようとしましたが、印刷結果が冒頭でまだ-1だった、私はこれが原因で算術右シフトの符号拡張性質のものであると思いました。しかし、追加のテストによって、私は-1 >> [0, 64]-1であることがわかりました。なぜこうなった?Javaで-1のビットシフトが機能しないのはなぜですか?

+2

これは算術右シフトの符号延びる性質を_is_。 '-1'は' 0xffffffff'です。一番左のビットは '1'なので、右シフトを計算すると1ビット進んでくるので、' 0xffffffff'のままです。 –

+0

@AdrianColomitchiその質問のダップではありません。その場合、答えは、シフト演算子がシフト量の下位5ビットのみを使用するという事実と関係しているので、 '1 >> 32'は' 1 >> 0'と同じです。この質問は、記号拡張に関するものです。私はそれがdupだと確信しています、ちょうどその質問ではありません。 –

答えて

4

これは、符号拡張です。 -1は、1だけを含むビットシーケンスによって表される。したがって、符号拡張を伴う右シフトを使用すると、ビットシフトの第2オペランドにかかわらず、常にすべてのビット1、すなわち-1を有するシーケンスが得られる。

+0

@KelvinZhang符号ビットはありません。最上位ビットがセットされている場合、これは、他のビットによって表される(符号なし)数から「2^31」を減算することを意味する。 (2の補数表現) – fabian

関連する問題