4

私はここでこの表現にかなり混乱しています。私は Java プログラマーですが、ビット操作にはあまり詳しくありません。

私は以下を正しく理解していると思います:

Input : 1 << 10
Output: 0000000000000000000010000000000

正の数の場合、1 を 10 ビットずつ移動すると思います。

混乱は、私が以下を持っているときです:

int val = -10 (binary representation : 1111111111111111111111111110110 )
Input : 1 << val
Output: 0000000010000000000000000000000 

誰かが負の数による左シフトまたは右シフトの意味を説明できれば、それは本当に素晴らしいことです.

4

2 に答える 2

9

<<(およびその他のシフト演算子) は、 の場合は右オペランドの最下位ビットを 5 ビット、 の場合はint6ビットのみを使用します。これは、31 を超えlongてシフトしても意味がないためです。int

あなたの場合は0b10110=22です。

したがって1 << (-10)、 と同等1 << 22です。

于 2013-09-12T18:26:47.893 に答える
5

JLS のセクション 15.19から:

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

言い換えると、

1 << -10

次と同等です。

1 << (-10 & 0x1f)

...それは

1 << 22
于 2013-09-12T18:30:51.843 に答える