算術エンコーダーのこのコードを見つけましたが、コメントに記載されている値がどこから来ているのか少し混乱しています。
これらの操作で何が起こっているのかを順を追って説明できる人はいますか?
protected final long STATE_SIZE = 32; // Number of bits for 'low' and 'high'. Must be in the range [1, 62] (and possibly more restricted).
protected final long MASK = (1L << (STATE_SIZE - 0)) - 1; // 111...111, all ones
これらはこれまでの私の仮定です:
- 「MASK」は1に設定されたLongを定義しています
- 次に、これを32シフトすると(私は思った)、100000 ... 00になります(Java.
- それから私は立ち往生します。「-1」がどのようにすべてを 1 に変更するのかわかりません。
私はこのコードを使用して自分で試しました:
long STATE_SIZE = 32;
long shifted = 1L << STATE_SIZE-0;
long shiftedMinusOne = shifted -1;
System.out.println("Shifted: " + shifted);
System.out.println("Shifted Minus One: " + shiftedMinusOne);
System.out.println("Shifted Binary: " + Long.toBinaryString(shifted));
System.out.println("Shifted Minus One Binary: " + Long.toBinaryString(shiftedMinusOne));
そして私の出力は次のとおりです。
Shifted: 4294967296
Shifted Minus One: 4294967295
Shifted Binary: 100000000000000000000000000000000
Shifted Minus One Binary: 11111111111111111111111111111111
私が何か間違ったことをしているのか、それとも-1がすべて1になる理由を教えてもらえますか?