C语言中的位异或运算

C语言中的位异或运算,c,bitwise-operators,C,Bitwise Operators,我正在学习逐位运算,我遇到了一个异或运算 #include<stdio.h> #include<conio.h> int main { printf("%d\n",10 ^ 9); getch(); return 0; } #包括 #包括 int main { printf(“%d\n”,10^9); getch(); 返回0; } 10的二进制形式-->1010 9--->1的二进制形式 所以在异或中,当一个输入为1,另一个为0时,输出为1

我正在学习逐位运算,我遇到了一个异或运算

#include<stdio.h>
#include<conio.h>
int main
{
    printf("%d\n",10 ^ 9);
    getch();
    return 0;
}
#包括
#包括
int main
{
printf(“%d\n”,10^9);
getch();
返回0;
}
10的二进制形式-->1010 9--->1的二进制形式

所以在异或中,当一个输入为1,另一个为0时,输出为1

所以10^9的输出是01=>3

所以当尝试使用-10^9时,我得到的输出是-1

#include<stdio.h>
#include<conio.h>
int main
{
    printf("%d\n",-10 ^ 9);
    getch();
    return 0;
}
#包括
#包括
int main
{
printf(“%d\n”,-10^9);
getch();
返回0;
}
谁能给我解释一下-1是怎么回事吗


提前感谢所有帮助我们的人

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

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

-10^9
不等于
-(10^9)

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

11110110(2)异或00001001(2)=11111111(2)


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

负数的二进制表示法使用一个称为的概念。基本上,每一位都是先翻转,然后加1

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

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

如果将该值与9进行异或运算,它将如下所示:
11110110 XOR 00001001=11111111


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

继续评论

在2的补码系统中,负值由符号扩展到类型宽度的值表示。如果
10
是二进制的
1010
,则4字节整数的
-10
的两个补码表示为:

11111111111111111111111111110110
(其无符号值为
4294967286

现在您可以看到使用
9
(二进制
1001
)执行
xor
时会发生什么情况


结果是符号扩展到32位的
1111
,或有符号的
int
11111111111111111
,即
-1

减号“-”的优先级高于异或“^”运算符。首先我们找到-10的值

10的二进制等价物是1010,用8位表示就变成了0000 1010

对于有符号的数字,我们取2的10的补数。 首先找到0000 1010的1的补码

   0000 1010  ----- 1's complement ---- 1111 0101 
现在通过在1的补码结果中加1来查找2的补码

   1's complement   ---------  1111 0101
   Adding 1         ---------          1
   2's complement   ---------  1111 0110
现在执行-10^9(当两个位不同时,异或运算符给出1,否则给出0)

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


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

您的
-10
符号扩展。(这就是为什么按位操作通常在无符号类型上执行)可能与您期望的答案重复?如果你想要3,你可以使用像<代码>(10 ^ 9)< /C> >的括号,但是我不确定你真正想要做什么。除了它是C语言和帖子有C++之外,它的复制是一个重复的问题,但是答案已经解释了。所以,在问问题之前先搜索!非常感谢你!当然,很乐意帮忙。要在二的恭维系统中从正数转换为负数,只需在正数中使用位反运算(翻转所有位)并添加
1
。(为了回去,你只要再做一次)谢谢你的帮助
   1's complement   ---------  1111 0101
   Adding 1         ---------          1
   2's complement   ---------  1111 0110
  -10   -------  1111 0110
    9   -------  0000 1001
 --------------------------
 -10^9  -------  1111 1111