按位运算Java - 长到二进制

时间:2013-04-09 11:48:24

标签: 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 << (STATE_SIZE - 0)) - 1;  //  111...111, all ones

这是我到目前为止的假设:

  • “MASK”定义Long设置为1
  • 然后把它移动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?

6 个答案:

答案 0 :(得分:3)

请注意长度差异:

  100000000000000000000000000000000 - 1
=  11111111111111111111111111111111

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

答案 1 :(得分:2)

-1将二进制10000更改为1111的原因与更改

相同
  • 十进制100009999
  • hex 10000ffff
  • 八进制100007777

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

答案 2 :(得分:2)

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

 100000000000000000000000000000000 - 000000000000000000000000000000001 
  = 011111111111111111111111111111111

答案 3 :(得分:2)

你在做什么并没有错......

4294967296 = 2 ^ 32

编号系列:100000000000000000000000000000000 = 4294967296(34位)

编号系列:11111111111111111111111111111111 = 4294967295(33位数)

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

另外我相信MASK的想法是你有一系列111111 .... s按位AND或按位OR与其他数字做精巧的数学。

干杯。

答案 4 :(得分:1)

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

答案 5 :(得分:1)

简单。

4294967295的二进制值为11111111111111111111111111111111

参考Decimal to Binary conversion