java理解按位操作

标签 java bit-manipulation

最近我一直在学习按位运算符,一路上有这样的代码,使用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。 这意味着我们基本上检查 bt 位为 1 的位置是否为 1 >。从左到右的所有位都是这样做的。

关于java理解按位操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44475313/

相关文章:

java - Java 能不能像 C++ 一样初始化对象数组中的对象,而不必循环调用 new?

java - 将XML解析为TextView : android

java - 在Java中,字符的int值应该称为它的ASCII值还是Unicode值

java - 隐藏布局中的所有控件

c++ - 将 32 0/1 值打包到单个 32 位变量的位中的最快方法是什么?

c - 二进制数中1的个数

python - Python中Bit-wise NOT的含义

java - LinkedHashMap removeEldestEntry 和重写删除

php - ~ 位运算符(波浪号)的作用是什么

仅使用按位运算计算设置的位数