C中的按位异或运算

Bitwise XOR operation in C

我正在学习按位运算,遇到异或运算,

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

10的二进制形式---> 1 0 1 0 9 的二进制形式 ---> 1 0 0 1

所以在 XOR 中,当一个输入为 1 而另一个为 0 时,输出为 1。

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

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

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

谁能解释一下 -1 是怎么来的?

在此先感谢所有提供帮助的人!

因为异或的运算符优先级低于一元负

-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。

负数的二进制表示使用了一个叫做two's complement的概念。基本上,先翻转每一位,然后加 1。

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

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

如果你将这个值与 9 进行异或,它看起来会像这样:11110110 XOR 00001001 = 11111111.

11111111是1的补码,所以最后的答案是-1。

从评论继续。

在二进制补码系统中,负值由 sign-extended 到类型宽度的值表示。 10 在二进制中是 1010,对于 4 字节整数,-10 的 two-complement 表示是:

11111111111111111111111111110110

(无符号值为 4294967286

现在你看到当你 xor9(二进制 1001),

时会发生什么
  11111111111111111111111111110110
^                             1001
----------------------------------
  11111111111111111111111111111111  (-1 for a signed integer)

结果是 1111,即 sign-extended 到 32 位,或 11111111111111111111111111111111 对于带符号的 int,即 -1

减号“-”的优先级高于异或“^”运算符。所以首先我们求出-10的值。

10 的二进制等价物是 1010 & 以 8 位表示为 0000 1010 。

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

   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(当两个位不同时 XOR 运算符给出 1,否则给出 0)

  -10   -------  1111 0110
    9   -------  0000 1001
 --------------------------
 -10^9  -------  1111 1111

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

这就是输出变为 -1 的原因。