按位異或
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 操作的專有性質。
使用這個,當 a
(0101
)的二進位制值和 b
(1001
)的二進位制值是 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;