按位異或

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;