C中的按位异或运算

时间:2018-02-20 04:53:55

标签: c bitwise-operators

我正在学习按位操作,我遇到了xor操作,

#include<stdio.h>
#include<conio.h>
int main
{
    printf("%d\n",10 ^ 9);
    getch();
    return 0;
}

二进制形式10 ---&gt; 1 0 1 0 二进制形式9 ---&gt; 1 0 0 1

因此,在XOR中,当其中一个输入为1而另一个输入为0时,输出为1.

因此10 ^ 9的输出是0 0 1 1 =&gt; 3

因此,在尝试-10 ^ 9时,我将输出设为-1。

#include<stdio.h>
#include<conio.h>
int main
{
    printf("%d\n",-10 ^ 9);
    getch();
    return 0;
}

有人能解释我是怎么回事-1?

提前感谢所有帮助过的人!

4 个答案:

答案 0 :(得分:6)

因为XOR的运算符优先级低于一元减号。

也就是说,-10 ^ 9等于(-10) ^ 9 -10 ^ 9不等于-(10 ^ 9)

-10是11110110 (2),9是00001001 (2)

11110110 (2) XOR 00001001 (2) = 11111111 (2)

11111111 (2)在2的补码表示中为-1。

答案 1 :(得分:2)

继续发表评论。

在双补码系统中,负值由符号扩展的值表示为该类型的宽度。其中ROOT_DIR := $(abspath $(ROOT_DIR)) 10二进制,{4}整数的1010的双补码表示为:

-10

(其无符号值为11111111111111111111111111110110

现在您看到当4294967286xor(二进制9),

时会发生什么
1001

结果为 11111111111111111111111111110110 ^ 1001 ---------------------------------- 11111111111111111111111111111111 (-1 for a signed integer) ,其符号扩展为32位,或1111为签名11111111111111111111111111111111,即int

答案 2 :(得分:1)

负数的二进制表示使用名为two's complement的概念。基本上,每个位都先翻转然后再加1。

例如,8位表示正10将是00001010。要制作-10,首先翻转位:11110101,然后添加1:11110101 + 1 = 11110110

因此-10的二进制表示是11110110

如果你用9对这个值进行异或,它看起来就像这样:11110110 XOR 00001001 = 11111111

11111111是1的两个补码,因此最终的答案是-1。

答案 3 :(得分:0)

减号' - '符号的优先级高于xor'^'运算符。所以首先我们找到-10的值。

10的二进制当量是1010&amp;以8位表示的表示变为0000 1010。

对于签名号码,我们采用10的2的补码。      首先找到1的补充0000 1010

'static

现在通过添加1合1的补码结果找到2的补码。

eval()

现在执行-10 ^ 9(当两个位不同时,XOR运算符给出1,否则它给出0)

   0000 1010  ----- 1's complement ---- 1111 0101 

-10 ^ 9 = 1111 1111,等于有符号数字中的-1。

这就是为什么输出变为-1。