请解释输出

时间:2011-04-13 13:37:31

标签: c bitwise-operators

#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,请解释如何?

7 个答案:

答案 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)

获取一些纸张和您选择的书写工具

以二进制形式写出-3和5(有关如何做负数,请参阅twos complement

提示:|是指OR,&amp;意味着和

答案 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的补充,那么你应该知道

  1. 如何将2位补码中的3和5写为bit31 bit32 ... bit3n和bit51 bit52 .. bit5n
  2. 如何计算bit3i |的结果bit5i for i = 0 ... n
  3. 如何将结果转换回基数10
  4. 那应该给你第一个答案,同样的&amp;为了第二个。

答案 6 :(得分:-1)

听说过DeMorgan的法律...... ???提示位于linky中,它是表格和体现逻辑的原始冷酷真理的表格,它固定在主要语言编译器的语法中......

更令人担心的是,你没有基本的CS101知识并发布这个问题(对不起,如果你认为这是居高临下但不是),我真的不敢相信你正在看一个C代码和没有告诉任何关于两个补充,按位逻辑......这里的事情是非常错误的...如果你的大学讲师没有告诉你任何一个,那么讲师根本不应该讲课并找到另一个工作.... 叹息