前言
最近看JDK源码发现代码中竟然会出现无符号右移负数的形式,很有意思。
正文
比如在util包中RegularEnumSet类的第54行:
java.util.RegularEnumSet
class RegularEnumSet<E extends Enum<E>> extends EnumSet<E> {
...
void addAll() {
if (universe.length != 0)
elements = -1L >>> -universe.length;//第54行
}
...
}
这行代码实在有趣,我之前从没有想过一个数经过无符号右移负数会是什么结果
为了看结果,我写了如下测试代码:
public class Demo {
public static void main(String[] args) {
long l = -1l;
System.out.println(l>>>-3);
}
}
上述代码运行的结果是7(二进制:111),而一个64个1的二进制数(-1L),右移61位即可得到111,由此可知右移-3位相当于右移61位。
但具体的规则有待研究,待找到官方解释就贴上来。
在研究JDK源码时,发现RegularEnumSet类中使用了无符号右移负数的操作,通过测试代码解析了这一操作背后的逻辑,揭示了其等效于特定正数位移的效果。

被折叠的 条评论
为什么被折叠?



