按位异或
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;