3

算術エンコーダーのこのコードを見つけましたが、コメントに記載されている値がどこから来ているのか少し混乱しています。

これらの操作で何が起こっているのかを順を追って説明できる人はいますか?

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になる理由を教えてもらえますか?

4

6 に答える 6

1

単純。

のバイナリ値429496729511111111111111111111111111111111

参照10 進数から 2 進数への変換

于 2013-04-09T12:01:23.840 に答える
1

4294967296 = 2^32 = 10000000000000000000000000000000 (ビット 32 が設定されます)
4294967295 = 2^31+2^30 ... + 2^1 + 2^0 (ビット 0 ~ 31 が設定されます)

于 2013-04-09T11:59:47.100 に答える