次のコードを検討してください。
- 1 >> 34 = 0、
- 1 << 34 = 4 // 循環シフト
なぜそのような非対称なのですか?
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 ビットを使用して計算されます。循環シフト操作ではありません。どちらもそうではありません。これは、彼らがどのように振る舞うように意図されているかです。
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
オラクルのドキュメント1>>34
に従って、符号付きシフト演算子で右にシフトすると、左は符号で埋められます。この場合、1 は正であるため、符号は 0 です。1 つは最初のシフトで失われます。1>>1 = 0
符号付きシフト演算子で左にシフトすると1<<34
、次のことが起こります。
0x0001<<34 = (0x0001 << 32) << 2 = 0x0004 = 4