无符号右移一个负数会得到什么结果?

前言

最近看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位。

但具体的规则有待研究,待找到官方解释就贴上来。

你可能感兴趣的:(java)