前言
最近看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位。
但具体的规则有待研究,待找到官方解释就贴上来。