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

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

根据这个页面 ,3和5导致1.另外,3 | 5结果是7.我唯一的问题就是:

  • 我们如何获得1和3和5?
  • 我们如何获得3 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中的否定被定义为二的补充否定(这是非常常见的)。
所以-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的表示forms与8相同,因此-8(在4位数学中)是一个自身为负的数字(如零)。

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

 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 ,所以到处都是0。

3&5 => 1

二进制3是0011。

二进制5是0101。

应用按位和

  0011 & 0101 ------ 0001 => 1 in decimal 

采用相同的想法,以及每个操作的真值表,并将它们应用于您的具体问题。

您需要将数字转换为二进制,此时您需要记住“b1和b2 = 1”,只有它们都是1,而“b1或b2 = 0”只有它们都是0。

所以举个例子

 5 or 3 = 101 or 011 = 111 = 7 5 and 3 = 101 and 011 = 001 = 1