这个位移操作在Java RegularEnumSet实现中意味着什么?

时间:2012-11-20 03:18:41

标签: java enumset

RegularEnumSet实施中,有一个代码:

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

它使用Long类型整数来实现高效的EnumSet。

值得注意的是>>>的右手操作数是数字。

我已经测试并发现了

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

具有同等效果
int i = 1;
i << 3;

那么为什么还要用这种模棱两可的形式来写呢?

2 个答案:

答案 0 :(得分:2)

从“Java语言规范”第15.19节开始,关于移位“如果左侧操作数的提升类型很长,则只使用右侧操作数的六个最低位作为移位距离就好像右和操作数受掩码值0x3f的按位逻辑AND运算符和。实际使用的移位距离因此是0到64,包括0和64。

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

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

答案 1 :(得分:0)

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

  

&GT;&GT;&GT; -3与&lt;&lt;&lt;&lt; 3

它没有。无符号右移运算符(&gt;&gt;&gt;)将零移位到符号位,而>><<保留被移位的值的符号,相应地移位1或0。这就是-1L >>> -3为7(0111b)和1L << 3为8(1000b)的原因。