3 和 5:
0011
0101
----- AND
0001 == 1
3 | 5:
0011
0101
----- OR
0111 == 7
Java 中的否定定义为二进制补码 http://en.wikipedia.org/wiki/Two%27s_complement否定(这是极其常见的)。
So -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。