RegularEnumSet実装には、次のコードがあります。
elements = -1L >>> -universe.lengh
Long 型の整数を使用して効率的な EnumSet を実装します。
注目すべきは、 の右側のオペランドが>>>負の数であることです。
私はテストし、それを発見しました
int i = -1;
i >>> -3
と同等の効果があります
int i = 1;
i << 3;
では、なぜわざわざこのあいまいな形式で書くのでしょうか。
「Java言語仕様」のセクション15.19から、シフトについて「左側のオペランドの昇格された型が長い場合、右側のオペランドの最下位6ビットのみがシフト距離として使用されます。あたかも右側の and オペランドがマスク値 0x3f を使用してビットごとの論理 AND 演算子 & にかけられたかのように. したがって、実際に使用されるシフト距離は 0 から 64 までです。
したがって、と>>> -3同等の効果があります。>>> 61-1L >>> -n-1L >>> (0x3f&-n)
1s実際、これは long 整数の最下位 n ビットで連続を生成する最も効果的な方法のようです。
まず、引用したコードは -1 ではなく -1L を使用していることに注意してください。long は符号なしであるため、-1L は long のすべてのビットを設定すること、または可能な限り最大の long 数を取得することと同じです。
>>> -3 は << 3 と同等の効果があります
そうではありません。符号なし右シフト演算子 (>>>) は、ゼロを符号ビットにシフトしますが、シフトされる値の符号を保持し、それに応じて 1 または 0 をシフトします>>。<<そのため-1L >>> -3、7 (0111b) と1L << 38 (1000b) です。