符号なしで負の数を右に移動すると、どのような結果が得られますか?

3435 ワード

前言
最近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 
	}
    ...
 }

この行のコードは本当に面白くて、私は前に1つの数が記号なしで右に負の数を移動してどんな結果になるか考えたことがありません.結果を見るために、私は次のテストコードを書きました.
public class Demo {
	public static void main(String[] args) {
		long l = -1l;
		System.out.println(l>>>-3);
	}
}

上記コードの実行結果は7(バイナリ:111)であり、一方64個1のバイナリ数(-1 L)であり、61ビットを右にシフトすれば111が得られることから、右シフト-3ビットが61ビットを右にシフトすることに相当することが分かる.
しかし、具体的なルールは検討され、公式の解釈が見つかると貼られます.