【问题标题】:Bitwise XOR operation in CC中的按位异或运算
【发布时间】:2018-02-20 04:53:55
【问题描述】:

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

#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的?

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

【问题讨论】:

标签: c bitwise-operators


【解决方案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。

【讨论】:

    【解决方案2】:

    从评论继续。

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

    11111111111111111111111111110110
    

    (无符号值为4294967286

    现在你看看当你 xor9(二进制 1001)时会发生什么,

      11111111111111111111111111110110
    ^                             1001
    ----------------------------------
      11111111111111111111111111111111  (-1 for a signed integer)
    

    结果是 1111,符号扩展为 32 位,或 11111111111111111111111111111111 符号 int,即 -1

    【讨论】:

    • 非常感谢!
    • 当然,很高兴为您提供帮助。要在二进制补码系统中将正表示转换为负表示,您只需在正数中使用按位否定(翻转所有位)并添加1。 (要回来,你只需再做一次)
    【解决方案3】:

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

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

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

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

    11111111 是 1 的二进制补码,因此最终答案为 -1。

    【讨论】:

    • 感谢您的帮助
    【解决方案4】:

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

    10 的二进制等价物是 1010,而 8 位的表示形式为 0000 1010。

    对于有符号数,我们取 10 的 2 补码。 首先找到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(当两个位不同时,XOR 运算符给出 1,否则给出 0)

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-04
      • 1970-01-01
      • 1970-01-01
      • 2021-07-19
      • 2021-12-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多