5

シフトされた数値が正の場合、>>> と >> は同じように機能します。

シフトされた数値が負の場合、>>> は最上位ビットを 1 で埋めますが、>> 操作は MSB を 0 で埋めます。

私の理解は正しいですか?

負の数が MSB を 1 に設定して格納され、Java が使用する 2 の補数の方法ではなく、演算子の動作がまったく異なる場合、正しいでしょうか?

4

3 に答える 3

8

負の数を表す方法は、2 の補数と呼ばれます。これがどのように機能するかを示すために、例として -12 を取り上げます。12 は 2 進数で 00001100 です (整数は 8 ビットと仮定しますが、実際にはもっと大きいと仮定します)。すべてのビットを単純に反転して 2 の補数を取ると、11110011 が得られます。次に、1 を足すだけで 11110100 が得られます。同じ手順をもう一度適用すると、正の 12 が返されることに注意してください。

>>> は何があってもゼロにシフトするので、12 >>> 1 は 00000110 (6) になり、(-12) >>> 1 は 01111010 (122) になります。 Java の場合、Java の int は実際には 8 ビットよりもはるかに大きいため、はるかに大きな数値が得られます。

>> は最上位ビットと同じビットをシフトするため、正の数は正のまま、負の数は負のままになります。12 >> 1 は 00000110 (まだ 6) で、(-12) >> 1 は 11111010 で、マイナス 6 です。

于 2009-12-29T00:53:50.360 に答える
2

>>>Java 言語仕様での演算子の定義:

の値はn>>>s、ゼロ拡張で n ビット右シフトされた s ビット位置です。n が正の場合、結果は の結果と同じになりn>>sます。n が負の場合、左側のオペランドの型が の場合、結果は式の結果と等しくなり(n>>s)+(2<<~s)、左側のオペランドの型が の場合、式の結果と等しくintなります(n>>s)+(2L<<~s) long

于 2009-12-29T00:48:31.570 に答える
1

正反対に、ho ビットが 1 の場合、>>> は 0 で埋められ、>> は 1 で埋められます。

于 2009-12-29T00:47:15.273 に答える