按位添加相反的符号

时间:2014-04-26 10:08:59

标签: c bit-manipulation bitwise-operators twos-complement bitwise-xor

int main(){
        int a = 10, b = -2;
        printf("\n %d \n",a^b);
        return 0;
}

该程序输出-12。我无法理解。请解释一下。

0111 1110 -> 2's complement of -2
0000 1010 -> 10
---------
0111 0100

这似乎不大于-12并且是+ ve。但是我怎么把o / p作为-12?

4 个答案:

答案 0 :(得分:2)

要找到负整数的二进制补码,首先要找到其大小的二进制表示。然后翻转其所有位,即应用按位NOT运算符!。然后将1添加到其中。因此,我们有

2       -->  0000 0000 0000 0010
~2      -->  1111 1111 1111 1101  // flip all the bits
~2 + 1  -->  1111 1111 1111 1110  // add 1

因此,-2在二进制补码中的二进制表示是

1111 1111 1111 1110

现在,假设int的大小为4,则ab在两个补码中的表示形式为 -

a -->        0000 0000 0000 1010  --> 10
b -->        1111 1111 1111 1110  --> -2
a^b -->      1111 1111 1111 0100  --> -12

运算符^是按位XOR或独占OR运算符。如果对ab的相应位进行操作,并且仅当位不是10时才评估为1,否则它将评估为0

答案 1 :(得分:2)

似乎合法!

1111 1110   (-2)
xor
0000 1010   (10)
=
1111 0100   (-12)

答案 2 :(得分:1)

^是按位xor,而不是幂

a = 10 = 0000 1010
b = -2 = 1111 1110
__________________
a^b    = 1111 0100 = -12

答案 3 :(得分:0)

(int) -2 = 0xfffffffe

(int) 10 = 0x0000000a                                  

0xfffffffe ^ 0x0000000a = fffffff4 = (int) -12