【发布时间】: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
非常感谢您的帮助:)
【问题讨论】:
-
现在的计算机使用二进制补码,因此
-34由256-34表示为无符号字节。 -
非常感谢,-34&128 现在返回 128 是有道理的 :)
标签: java bit-manipulation