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

Zol*_*olt 0 java bit-manipulation bitwise-operators

我很惊讶我无法在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);
Run Code Online (Sandbox Code Playgroud)

生成此输出:

1
7
8
Run Code Online (Sandbox Code Playgroud)

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

Jer*_*vel 6

3和5:

0011
0101
----- AND
0001 == 1
Run Code Online (Sandbox Code Playgroud)

3 | 5:

0011
0101
----- OR
0111 == 7
Run Code Online (Sandbox Code Playgroud)

Java中的否定被定义为二的补充否定(这是非常常见的).
所以-x = ~x + 1 = ~(x - 1).

8&-8:

00001000 //8
11111000 //-8
-------- AND
00001000 // 8
Run Code Online (Sandbox Code Playgroud)

使用最后的否定定义,-1首先借用所有最右边的零(如果有的话),设置它们,直到它击中1,它重置,左边的任何东西都保持不变.补码然后恢复最右边的零和最右边的零(所有这些都被-1有效补充),并补充最右边的一切:

00001000 // 8
00000111 // 8 - 1 = 7
11111000 // -8
Run Code Online (Sandbox Code Playgroud)

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

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

01100100 // 100
01100011 // 99
10011100 // -100
Run Code Online (Sandbox Code Playgroud)

现在&100:

01100100 // 100
10011100 // -100
-------- AND
00000100 // 4
Run Code Online (Sandbox Code Playgroud)

通常,x & -x隔离最右边的1.最右边的零而不是最右边的1都不会受到否定的影响,因此对于数字的那一部分,它看起来就像你正在做的那样x & x(当然x).在最右边的一个的上半部分是补充的,所以你所拥有的1变为0,并且你所拥有的1的每个变为0. 0 & 1 = 0,因此在任何地方都给出0.