0

Java で long の特定のビットを表示するマスクを作成しようとしています。私は次のことを試しました:

long mask = ~ (0xffffffff << 32);

これをコンソールに出力すると 0 が返されますが、結果は 0x00000000FFFFFFFFL のようになり、2^32 - 1 は 4294967295 に等しいため、4294967295 が期待されます。長いマスクをシフトすると機能しますが、理由がわかりません。

long mask = ~ (0xFFFFFFFFFFFFFFFFL << 32);

誰でもこの動作を説明できますか?

4

2 に答える 2

3

Java は、 に対して算術演算を実行している場合、 ではなく、intsを取得したいと想定しています。(計算が完了した後に出力を に割り当てても、計算自体には影響しません。)intlonglong

intan (32 ビット) を 32桁左シフトしても何も起こりません。を左シフトするintと、右側のオペランドの最下位 5 ビットのみが使用され、0 ~ 31 の範囲の数値が得られます。
http://docs.oracle.com/javase/specs/jls/se8 /html/jls-15.html#jls-15.19

だからこそ(0xffffffff<<32)==0xffffffff、そして~(0xffffffff<<32)==0

a (64 ビット) をシフトする場合、long下位 6 ビットが使用され、0 から 63 の範囲の数値が得られます。

を使用する0xffffffffLと、Java は別の を生成することを認識しlongます。したがって、数字の左端から外れることなく、32 桁シフトできます。

于 2016-06-17T08:52:13.183 に答える
1

左シフトはモジュラス† データ型のサイズです。たとえば、32 ビットの int のシフトは効果がありません。

(0xffffffff << 32) ==
(0xffffffff << (32 % Integer.SIZE)) ==
(0xffffffff << (32 % 32)) ==
(0xffffffff << 0) ==
0xffffffff

そして~of0xffffffffは です0x00000000。つまり、0これはあなたが見ているものです。

次に、64 ビットでは、64 未満であるため、完全な 32 ビット シフトが適用されます。

(0xffffffffL << 32) ==
(0xffffffffL << (32 % Long.SIZE) ==
(0xffffffffL << (32 % 64) ==
(0xffffffffL << 32) ==
0xffffffff00000000L

† 厳密に言えば、int の場合は最後の 5 ビット、long の場合は最後の 6 ビットを使用しているため、負の左シフトのモジュラスに違いが生じます。

于 2016-06-17T09:01:13.040 に答える