Javaでは、なぜ-32 >>> -1 = 1なのですか?
-32だけに固有のものではありません。大きすぎない限り、すべての負の数に対して機能します。
x >>>
-1 = 1
x >>> -2 = 3
x >>> -3 = 7
x >>> -4=15
与えられた0>x>いくつかの大きな負の数
>>>-1は<<1と同じではありませんか?ただし、-32 << 1=-64です。
私は2つの補語を読みましたが、それでも理由がわかりません。
Javaでは、なぜ-32 >>> -1 = 1なのですか?
-32だけに固有のものではありません。大きすぎない限り、すべての負の数に対して機能します。
x >>>
-1 = 1
x >>> -2 = 3
x >>> -3 = 7
x >>> -4=15
与えられた0>x>いくつかの大きな負の数
>>>-1は<<1と同じではありませんか?ただし、-32 << 1=-64です。
私は2つの補語を読みましたが、それでも理由がわかりません。
これは、32ビットをシフトする場合int、シフト距離の最後の5ビットだけがかかるためです。(つまり、mod 32)、つまり-1 mod 32 = 31なので、31ビット右にシフトします。負の数(最初のビットはすべて1)をシフトすると、1になります。同様に、右に-2シフトすると、右に30ビットシフトします。aをシフトするlongと、6がかかります。シフト距離のビット。シフト演算子の動作の仕様については、http:
//docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.19を参照してください。
Java は、左オペランドのサイズに基づいて右オペランドをマスクします。
32 ビットint iの場合、
i << N --> i << (N mod 32)
64 ビットlong numの場合、
num << N --> num << (N mod 64)
このシフト カウント オペランドのマスキングは、 および にも適用され>>ます>>>。
int( long) の場合、右側のオペランドの最下位 5 ビットのみがシフト距離として使用されます。」iの