在RegularEnumSet
实施中,有一个代码:
elements = -1L >>> -universe.lengh
它使用Long类型整数来实现高效的EnumSet。
值得注意的是>>>
的右手操作数是负数字。
我已经测试并发现了
int i = -1;
i >>> -3
与
具有同等效果int i = 1;
i << 3;
那么为什么还要用这种模棱两可的形式来写呢?
答案 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)的原因。