我很惊讶我在Google上找不到这个简单的问题答案。在检查了十几个不同的页面后,我将在这里问...
根据this page,3& 5结果为1.另外,3 | 5结果是7.我唯一的问题就是:
另外,负数怎么样?
果然,在java中编写以下内容:
System.out.println(3&5);
System.out.println(3|5);
System.out.println(8&-8);
生成此输出:
1
7
8
但同样,这些结果如何确定/计算?
答案 0 :(得分:6)
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,它重置,左边的任何东西都留下修改。补语然后恢复最右边的零和最右边的零(所有这些都被-1有效补充),并补充最右边的一切:
00001000 // 8
00000111 // 8 - 1 = 7
11111000 // -8
请注意,如果您使用8位数字,则-8仅为11111000。如果你有更多的位,左边会有更多的1位。如果只有4位,则会遇到某种麻烦,因为-8的表示形式与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都不会受到否定的影响,因此对于数字的那一部分,看起来你正在做{{1} }(当然是x & x
)。最右边的一部分的左上角是补充的,所以你所拥有的1变为0,而你所拥有的1变为0. x
,所以到处都是0。
答案 1 :(得分:1)
3& 5 => 1
二进制中的3是0011。
二进制中的5是0101。
按位和
0011
& 0101
------
0001 => 1 in decimal
采用相同的想法,以及每个操作的真值表,并将它们应用于您的具体问题。
答案 2 :(得分:0)
您需要将数字转换为二进制数,此时您需要记住“b1和b2 = 1”,只有它们都是1,而“b1或b2 = 0”只有在它们都是0的情况下。
所以例如
5 or 3 = 101 or 011 = 111 = 7
5 and 3 = 101 and 011 = 001 = 1