按位操作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