按位操作Java-长到二进制

按位操作Java-长到二进制,java,binary,bit-manipulation,long-integer,bit-shift,Java,Binary,Bit Manipulation,Long Integer,Bit Shift,我发现这是一个算术编码器的代码,我有点搞不清楚注释中提到的值是从哪里来的 有人能一步一步地了解这些操作中发生的事情吗 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 <<

我发现这是一个算术编码器的代码,我有点搞不清楚注释中提到的值是从哪里来的

有人能一步一步地了解这些操作中发生的事情吗

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

有谁能告诉我我是否做错了什么,或者为什么-1使它们都是1?

请注意长度上的差异:

  100000000000000000000000000000000 - 1
=  11111111111111111111111111111111

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

由于相同的原因,
-1
将二进制
10000
更改为
1111

  • 十进制
    10000
    9999
  • 十六进制
    10000
    ffff
  • 八进制
    10000
    7777

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

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

 100000000000000000000000000000000 - 000000000000000000000000000000001 
  = 011111111111111111111111111111111

你所做的没有错

4294967296=2^32

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

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

如果您了解数字是如何用二进制表示的,那么这应该会让您更清楚

另外,我相信掩码的思想是让你有一系列111111…s按位和或按位或与其他数字一起做漂亮的数学运算


干杯。

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

简单

4294967295
的二进制值为
11111111111111111


参考。

有没有回答你的问题?我刚刚意识到这个问题有多愚蠢。我太专注于我正在做的事情,以至于把最简单的事情复杂化了。感谢所有回答的人!
  100000000000000000000000000000000 - 1
=  11111111111111111111111111111111
 100000000000000000000000000000000 - 000000000000000000000000000000001 
  = 011111111111111111111111111111111