1

[隠しリンク -- 悪質なサイトに発展] より

シフトする値 (左オペランド) が int の場合、シフトの実行には右オペランドの最後の 5 桁のみが使用されます。シフトの実際のサイズは、31 (0x1f) でマスクされた右側のオペランドの値です。つまり、シフト距離は常に 0 から 31 の間です (シフト値が > 32 の場合、シフトは 32 % 値です)。

35             00000000 00000000 00000000 00100011
31 -> 0x1f     00000000 00000000 00000000 00011111
&              -----------------------------------
Shift value    00000000 00000000 00000000 00000011   -> 3

-29            11111111 11111111 11111111 11100011
31 -> 0x1f     00000000 00000000 00000000 00011111
&              -----------------------------------
Shift value    00000000 00000000 00000000 00000011   -> 3

それは本当にどういう意味ですか?右シフトの場合、乗算できる最大値は 32 ということですか? これはオーバーフローを防ぐためですか?

4

2 に答える 2

2

型には 32 ビットあるため、0 から 31 の間の値にのみシフトできることを意味しますint。a のlong場合、0 ~ 63 ビットのみシフトできます。

他の値を指定すると、シフト量は& 31または& 63で適切にマスクされます。

たとえば、符号を拡張したい場合は、数値の下位 7 ビットを使用できます

n << -7 >> -7

これnは、intまたはlong


JLS 15.19から

左側のオペランドの昇格された型が int の場合、右側のオペランドの下位 5 ビットのみがシフト距離として使用されます。これは、右側のオペランドがマスク値 0x1f を使用してビットごとの論理 AND 演算子 & (§15.22.1) にかけられたかのようです。したがって、実際に使用されるシフト距離は、常に 0 から 31 までの範囲になります。

左側のオペランドの昇格された型が long の場合、右側のオペランドの下位 6 ビットのみがシフト距離として使用されます。これは、右側のオペランドが、マスク値 0x3f を使用してビットごとの論理 AND 演算子 & (§15.22.1) にかけられたかのようです。したがって、実際に使用されるシフト距離は常に 0 から 63 の範囲内です。

于 2012-10-09T10:21:31.647 に答える
2

掛けることができる最大値が 32 ではなく、2^31です。(ビットシフトは累乗であり、乗算ではありません)

整数は 32 ビットしかないことを考えると、とにかく 31 ビット以上シフトするとどうなると思いますか? 入力値に関係なく、まったく同じ結果が得られます-そのビットはすべて「最後から」シフトされているため、操作としてはまったく役に立ちません。

于 2012-10-09T10:23:51.670 に答える