[英]Bitwise Operations Java - Long to Binary
我发现这个代码用于算术编码器,我对评论中提到的值的来源有点困惑。
任何人都可以一步一步地了解这些操作中发生的事情吗?
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
这些是我迄今为止的假设:
我已经使用这段代码尝试了一下:
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?
请注意长度的差异:
100000000000000000000000000000000 - 1
= 11111111111111111111111111111111
这是一个正确的二进制减法。 你做得还好:)
-1
将二进制10000
更改为1111
,原因与更改相同
10000
到9999
或 10000
到ffff
或 10000
到7777
。 二进制只是恰好只有两位数的另一个数字表示。
您是否意识到二进制操作是:
100000000000000000000000000000000 - 000000000000000000000000000000001
= 011111111111111111111111111111111
你正在做什么没有错...
4294967296 = 2 ^ 32
编号系列:100000000000000000000000000000000 = 4294967296(34位)
编号系列:11111111111111111111111111111111 = 4294967295(33位数)
如果您了解数字如何用二进制表示,那么这应该清除它。
另外我相信MASK的想法是这样你有一系列的111111 .... s与按位AND或按位OR与其他数字做狡猾的数学。
干杯。
4294967296 = 2 ^ 32 = 100000000000000000000000000000000(设置位32)
4294967295 = 2 ^ 31 + 2 ^ 30 ... + 2 ^ 1 + 2 ^ 0(设置位0到31)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.