按位异或

int a = 5;     // 0101b  (0x05)
int b = 9;     // 1001b  (0x09)
int c = a ^ b; // 1100b  (0x0C)

std::cout << "a = " << a << ", b = " << b << ", c = " << c << std::endl;

输出

a = 5, b = 9, c = 12

为什么

有点明智的 XOR(独占或)在位级操作并使用以下布尔真值表:

true OR true = false
true OR false = true
false OR false = false

请注意,使用 XOR 操作时 true OR true = false 与操作 true AND/OR true = true 一样,因此 XOR 操作的专有性质。

使用这个,当 a0101)的二进制值和 b1001)的二进制值是 XOR‘时,我们得到 1100 的二进制值:

int a = 0 1 0 1
int b = 1 0 0 1 ^
        ---------
int c = 1 1 0 0

除非特别指定使用按位分配复合运算符^=,否则位有效 XOR 不会更改原始值的值:

int a = 5;  // 0101b  (0x05)
a ^= 9;    // a = 0101b ^ 1001b

可以以多种方式利用逐位 XOR,并且经常在位掩码操作中用于加密和压缩。

注意: 以下示例通常显示为一个很好的技巧示例。但是不应该在生产代码中使用(有更好的方法来实现相同的结果)。

你还可以使用 XOR 操作交换两个变量而无需临时:

int a = 42;
int b = 64;

// XOR swap
a ^= b;
b ^= a;
a ^= b;

std::cout << "a = " << a << ", b = " << b << "\n";

要进行生产,你需要添加一个检查以确保可以使用它。

void doXORSwap(int& a, int& b)
{
    // Need to add a check to make sure you are not swapping the same
    // variable with itself. Otherwise it will zero the value.
    if (&a != &b)
    {
        // XOR swap
        a ^= b;
        b ^= a;
        a ^= b;
    }
}

因此,尽管它看起来像是一个很好的技巧,但它在实际代码中并没有用。xor 不是基本逻辑运算,而是其他运算的组合:a ^ c =〜(a&c)&(a | c)

同样在 2015+编译器中,变量可以被指定为二进制:

int cn=0b0111;