0

次のコードを検討してください。

  1. 1 >> 34 = 0、
  2. 1 << 34 = 4 // 循環シフト

なぜそのような非対称なのですか?

4

3 に答える 3

5

JLS §15.19から:

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

だから、それ<<は円形で>>はないということではありません。それを信じさせたのは、あなたが選んだ価値だけです。

だけシフト1する34と、最下位 5 ビットが考慮されます。

1 >> 34  === 1 >> 2 === 0
1 << 34  === 1 << 2 === 4

以来34 & 0x1F == 2

ここで、ビットをシフトしても技術的2に得られない、より大きな値を取得します。0

4 >> 34 == 4 >> 2 == 1
4 << 34 == 4 << 34 == 16

typeのシフト距離intは、常に最下位 5 ビットを使用して計算されます。循環シフト操作ではありません。どちらもそうではありません。これは、彼らがどのように振る舞うように意図されているかです。

于 2013-10-14T11:47:26.677 に答える
2

Shift は、int には下位 5 ビットのみを使用し、long には下位 6 ビットのみを使用します。

1 >> 34 = 0

これは円回転ではないため、0 である 1 >> 2 と同じです。

1 << 34 = 4 // 循環シフト

これは 1 << 2 と同じです。シフトは int には下位 5 ビットのみを使用し、long には下位 6 ビットのみを使用します。

これは循環シフトではありません。

例えば

Integer.MIN_VALUE << 1 // is 0
于 2013-10-14T11:47:50.060 に答える
0

オラクルのドキュメント1>>34に従って、符号付きシフト演算子で右にシフトすると、左は符号で埋められます。この場合、1 は正であるため、符号は 0 です。1 つは最初のシフトで失われます。1>>1 = 0

符号付きシフト演算子で左にシフトすると1<<34、次のことが起こります。

0x0001<<34 = (0x0001 << 32) << 2 = 0x0004 = 4
于 2013-10-14T11:47:17.960 に答える