繁体   English   中英

按位运算Java - 长到二进制

[英]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

这些是我迄今为止的假设:

  • “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?

请注意长度的差异:

  100000000000000000000000000000000 - 1
=  11111111111111111111111111111111

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

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

  • 十进制100009999
  • 十六进制10000ffff
  • 八进制100007777

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

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

 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)

简单。

二进制值429496729511111111111111111111111111111111

参考十进制到二进制转换

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM