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" 定义了一个 Long 设置为 1
  • 然后将其移动 32 (我认为)将得到 100000...00 (我已经在 java.util.
  • 然后我就卡住了。我不确定“-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

3

请注意长度的差异:

  100000000000000000000000000000000 - 1
=  11111111111111111111111111111111

这是一个正确的二进制减法。你做得很好:)

于 2013-04-09T11:53:57.747 回答
2

-1二进制更改10000的原因1111与它更改的原因相同

  • 小数100009999
  • 十六进制10000ffff
  • 八进制100007777.

二进制只是恰好只有两位数字的另一种数字表示形式。

于 2013-04-09T11:55:06.973 回答
2

您是否意识到二进制操作是:

 100000000000000000000000000000000 - 000000000000000000000000000000001 
  = 011111111111111111111111111111111
于 2013-04-09T11:55:17.970 回答
2

你的所作所为并没有错...

4294967296 = 2^32

数字系列:100000000000000000000000000000000 = 4294967296(34位)

数字系列:11111111111111111111111111111111 = 4294967295(33位)

如果您了解数字是如何以二进制表示的,那么这应该可以清除它。

另外我相信 MASK 的想法是让你有一系列 111111....s 来按位与或按位或与其他数字进行漂亮的数学运算。

干杯。

于 2013-04-09T11:55:48.273 回答
1

4294967296 = 2^32 = 100000000000000000000000000000000(设置位 32)
4294967295 = 2^31+2^30 ... + 2^1 + 2^0(设置位 0 到 31)

于 2013-04-09T11:59:47.100 回答
1

简单的。

的二进制值429496729511111111111111111111111111111111

参考十进制到二进制的转换

于 2013-04-09T12:01:23.840 回答