java - 按位运算符的结果是如何产生的?

标签 java bit-manipulation bitwise-operators

我很惊讶我在 Google 上找不到这个听起来简单的问题的答案。在检查了大约十几个不同的页面后,我只想在这里问......

根据this page , 3 & 5 结果为 1。此外,3 | 5 结果是 7。我唯一的问题很简单:

  • 如何通过 3 和 5 得到 1?
  • 我们如何得到 7 for 3 | 5?

另外,负数怎么办?

  • 8 和 -8 如何得出 8?

果然,用java编写如下:

System.out.println(3&5);
System.out.println(3|5);
System.out.println(8&-8);

产生此输出:

1
7
8

但是,这些结果是如何确定/计算的?

最佳答案

3 和 5:

0011
0101
----- AND
0001 == 1

3 | 5:

0011
0101
----- OR
0111 == 7
<小时/>

Java 中的否定定义为 two's complement否定(这是极其常见的)。
所以-x = ~x + 1 = ~(x - 1)

8 和 -8:

00001000 //8
11111000 //-8
-------- AND
00001000 // 8

使用最后一个否定定义,-1 首先借用所有最右边的零(如果有的话),按原样设置它们,直到它达到 1,它会重置它,左边的任何内容都被留下未经修改。然后补码恢复最右边的 0 和最右边的 1(所有这些都被 -1 有效补足),并对最右边的 1 左边的所有内容求补:

00001000 // 8
00000111 // 8 - 1 = 7
11111000 // -8

请注意,如果您使用 8 位数字,则 -8 仅为 11111000。如果有更多的位,左边就会有更多的 1。如果只有 4 位,则会遇到某种麻烦,因为 -8 与 8 具有相同的表示形式,因此 -8(在 4 位数学中)是一个本身为负数的数字(如零)。

实际上,8并不是一个很好的例子,因为它太简单了。让我们做100 & -100(一百,而不是四):

01100100 // 100
01100011 // 99
10011100 // -100

现在和100:

01100100 // 100
10011100 // -100
-------- AND
00000100 // 4

一般来说,x & -x 隔离最右边的 1。最右边的 0 和最右边的 1 都不受负数的影响,因此仅对于数字的这一部分,它看起来像你'正在做x & x(当然是x)。最右边左边的上半部分是补码,因此凡是 1 的地方都变成 0,凡是 1 的地方都变成 0。0 & 1 = 0,因此得到 0无处不在。

关于java - 按位运算符的结果是如何产生的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20169287/

相关文章:

java - 在这种情况下如何评估按位运算符?

c++ - 正数和负数的位运算符

"DerInputStream.getLength(): lengthTag=109, too big."的 Java APNS 证书错误

java - JButton 不会调整大小以匹配其首选大小

java - 旋转 Java Graphics2D 矩形?

c - 仅当它为 0 时如何启用 octed 中的位?

c - 使用按位运算最多三个整数?

java - 哪个版本的 Java 支持 -command 选项?

algorithm - 给定一个数字找到下一个稀疏数字

java - java中i &=(i-1) 的含义是什么