#include<stdio.h>
int main(void)
{
int a=-3,b=5,c;
c=a|b;
printf("%d ",c);
c=a&b;
printf("%d ",c);
}
输出为-3 5
,请解释如何?
答案 0 :(得分:7)
要了解输出,您需要熟悉用于表示负二进制数的Two's Complement。从+ x到-x的转换实际上非常简单:补充所有位并添加一位。 现在假设您的整数长度为8位(足以检查5和-3):
5: 0000 0101
3: 0000 0011 => -3: 1111 1101
现在让我们看看按位或:
1111 1101 | 0000 0101 = 1111 1101
确切地说是-3
的再现现在是按位AND:
1111 1101 & 0000 0101 = 0000 0101
正好是5的二进制表示
答案 1 :(得分:2)
当您同时查看二进制表示时,它会有所帮助:
-3 == 1111 1111 1111 1101
+5 == 0000 0000 0000 0101
要理解的是,如果|
和&
在两边都具有相同的值,那么|
和&
都会有所不同。如果值不同(即一个操作数在该位置具有0而另一个具有1),则其中一个“获胜”,具体取决于您使用的是1111 1111 1111 1101
还是{{1}}。
当你将这些位组合在一起时,1s就赢了。但是,5在与-3中的0相同的位置具有0,因此该位通过OR运算不变。结果({{1}})仍然与-3相同。
当你按位进行AND时,零赢。但是,5中的1与-3中的1匹配,因此这些位通过AND操作不变。结果仍然是5。
答案 2 :(得分:1)
5
的二进制--is - &gt; 0000 0101
3 --> 0000 0011
- 1's Complement
- &gt; 1111 1100
- 2's Complement (add 1)
- &gt; 1111 1101
== -3。这就是它存储在内存中的方式。
按位或真值表:
p OR q
p || q || p | q
T(1) || T(1) || T(1)
T(1) || F(0) || T(1)
F(0) || T(1) || T(1)
F(0) || F(0) || F(0)
1111 1101
| 0000 0101
= 1111 1101
== -3
按位和真值表:
p AND q
p || q || p & q
T(1) || T(1) || T(1)
T(1) || F(0) || F(0)
F(0) || T(1) || F(0)
F(0) || F(0) || F(0)
1111 1101
&amp; 0000 0101
= 0000 0101
== 5
另请参阅 - What Every Computer Scientist Should Know About Floating-Point Arithmetic。
答案 3 :(得分:0)
答案 4 :(得分:0)
-3 = 0xFFFD = 1111 1111 1111 1101 5 = 0101所以按位或不改变第一个参数(只与1重叠),结果仍为-3
按位并取出1101和0101之间的coomon,即0101 = 5 :)没有理由考虑-3中的所有尾随,因为5 = 0000 0000 0000 0101
答案 5 :(得分:0)
如果你知道所有关于2的补充,那么你应该知道
那应该给你第一个答案,同样的&amp;为了第二个。
答案 6 :(得分:-1)