2

RegularEnumSet実装には、次のコードがあります。

elements = -1L >>> -universe.lengh

Long 型の整数を使用して効率的な EnumSet を実装します。

注目すべきは、 の右側のオペランドが>>>数であることです。

私はテストし、それを発見しました

int i = -1;
i >>> -3  

と同等の効果があります

int i = 1;
i << 3;

では、なぜわざわざこのあいまいな形式で書くのでしょうか。

4

2 に答える 2

2

「Java言語仕様」のセクション15.19から、シフトについて「左側のオペランドの昇格された型が長い場合、右側のオペランドの最下位6ビットのみがシフト距離として使用されます。あたかも右側の and オペランドがマスク値 0x3f を使用してビットごとの論理 AND 演算子 & にかけられたかのように. したがって、実際に使用されるシフト距離は 0 から 64 までです。

したがって、と>>> -3同等の効果があります。>>> 61-1L >>> -n-1L >>> (0x3f&-n)

1s実際、これは long 整数の最下位 n ビットで連続を生成する最も効果的な方法のようです。

于 2012-11-20T03:42:54.067 に答える
0

まず、引用したコードは -1 ではなく -1L を使用していることに注意してください。long は符号なしであるため、-1L は long のすべてのビットを設定すること、または可能な限り最大の long 数を取得することと同じです。

>>> -3 は << 3 と同等の効果があります

そうではありません。符号なし右シフト演算子 (>>>) は、ゼロを符号ビットにシフトしますが、シフトされる値の符号を保持し、それに応じて 1 または 0 をシフトします>><<そのため-1L >>> -3、7 (0111b) と1L << 38 (1000b) です。

于 2012-11-20T03:34:04.283 に答える