小编典典

按位运算符结果如何发生?

java

我很惊讶在Google上找不到这个简单的发音问题的答案。在检查了十几个不同的页面之后,我只想在这里询问…

根据此页面,3&5导致1。5等于7。我唯一的问题就是:

  • 我们如何获得3和5中的1?
  • 如何获得3分7分| 5?

另外,负数呢?

  • 8和-8如何得出8?

果然,用Java编写以下代码:

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

产生以下输出:

1
7
8

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


阅读 260

收藏
2020-11-30

共1个答案

小编典典

3&5:

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

3 | 5:

0011
0101
----- OR
0111 == 7

Java中的否定定义为二进制补码(非常常见)。
这样-x = ~x + 1 = ~(x - 1)

8&-8:

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

使用否定的最后定义,-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。最右边的零而不是最右边的1都不会受到否定的影响,因此,仅对那部分数字而言,这就像您在做的那样x & x(这当然是x)。上部,最右边一个的左侧,是互补的,因此您拥有1的任何地方都变为0,而拥有1的任何地方都变为0 0 & 1 = 0

2020-11-30