最近我一直在学习按位运算符,一路上有这样的代码,使用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
非常感谢您的帮助:)
最佳答案
将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
。
这意味着我们基本上检查 b
中 t
位为 1
的位置是否为 1
>。从左到右的所有位都是这样做的。
关于java理解按位操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44475313/