【问题标题】:java understanding bitwise manipulationjava理解按位操作
【发布时间】:2017-06-10 15:55:42
【问题描述】:

最近我一直在学习按位运算符,一路上有这段代码使用AND(&)按位运算符查找十进制数的二进制数字,代码如下:

 byte b = -34;

 for(int t = 128;t > 0; t = t/2)
{
 if((b & t) != 0)System.out.println("1 ");
 else System.out.println("0 ");
 System.out.println("b & t yields: " + (b & t));
   }

我已修改代码以显示 b&t 在每次迭代期间计算的值。我想了解这段代码背后的确切机制,为什么它可以找到二进制数字,请解释​​为什么每次迭代都将 b 与 t 进行比较,为什么每次迭代都将 t 除以 2?

此外,我想知道 (b&t) 是如何通过列出二进制数字来手动计算的。我确实了解 & 的工作原理,但是当我列出 34 和 128 的二进制数字并进行比较时:

1 0 0 0 0 0 0 0(128)
0 0 1 0 0 0 1 0(34) //I am unsure if the negative sign should be included
---------------
0 0 0 0 0 0 0 0

我得到的结果是 0,但是程序返回 128 令人困惑。

下面我还要附上程序的执行结果:

1 
b & t yields: 128
1 
b & t yields: 64
0 
b & t yields: 0
1 
b & t yields: 16
1 
b & t yields: 8
1 
b & t yields: 4
1 
b & t yields: 2
0 
b & t yields: 0

非常感谢您的帮助:)

【问题讨论】:

  • 现在的计算机使用二进制补码,因此-34256-34 表示为无符号字节。
  • 非常感谢,-34&128 现在返回 128 是有道理的 :)

标签: java bit-manipulation


【解决方案1】:

t 除以2 是向右移位:

1 0 0 0 0 0 0 0 128 = t
0 1 0 0 0 0 0 0 64  = t / 2
0 0 1 0 0 0 0 0 32  = t / 2 / 2
...

t 始终有一位设置为1,所有其他位设置为0

然后您使用& 将其与 b 进行比较。当且仅当两个输入中的对应位也是1 时,每个结果位都是1。 这意味着我们基本上在t位是1的位置检查b中的位是否是1。从左到右的所有位都是这样做的。

【讨论】:

    【解决方案2】:

    因为有两个问题: (1) OP 很困惑为什么他的手工计算与程序的代码不匹配,并且 (2) OP想知道为什么其中一个变量除以2。

    我只是结合了答案: (1) 负数表示为二进制补码。因此负 34 是

     0 0 1 0 0 0 1 0 <-- +34
     1 1 0 1 1 1 0 1 <-- one's complement of 34
     1 1 0 1 1 1 1 0 <-- two's complement of 34
    

    注意:二进制补码是一个补码+1。

    (2) 除以 2 向右移动(如果是二进制)。这就是为什么在循环中第三次输出零(128 中唯一的 1 与 -34 中的第三个零进行“与”运算)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多