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 节,关于移位“如果左侧操作数的提升类型为长,则仅使用右侧操作数的最低六位作为移位距离。它是就好像右操作数与掩码值为 0x3f 的按位逻辑 AND 运算符 & 一样。因此,实际使用的移位距离是 0 到 64,包括 0 到 64。

因此,>>> -3具有与>>> 61-1L >>> -n等价的效果-1L >>> (0x3f&-n)

实际上,这似乎是在1s长整数的最低 n 位中产生连续的最有效方法。

于 2012-11-20T03:42:54.067 回答
0

首先,请注意您引用的代码使用-1L,而不是-1。Long 是无符号的,因此 -1L 相当于设置 long 上的所有位,或获得可能的最高 long 数。

>>> -3 与 << 3 具有等效的效果

它没有。无符号右移运算符 (>>>) 将零移入符号位,同时>>保留<<被移位值的符号,相应地移位 1 或 0。这就是为什么-1L >>> -3是 7 (0111b) 和1L << 3是 8 (1000b)。

于 2012-11-20T03:34:04.283 回答