C++ ^-按位XOR(异或)
示例
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 = falsetrue 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 1int b = 1 0 0 1 ^
---------
int c = 1 1 0 0
逐位XOR不会更改原始值的值,除非专门指定使用逐位赋值复合运算符^=:
int a = 5; // 0101b(0x05)a ^= 9; // a = 0101b ^ 1001b
逐位异或可以多种方式使用,并且经常在位掩码操作中用于加密和压缩。
注意:以下示例通常作为一个很好的技巧示例显示。但不应在生产代码中使用(有更好的方法可以达到相同的结果)。std::swap()
您还可以利用XOR操作交换两个变量而无需临时操作:
int a = 42;int b = 64;
// 异或交换
a ^= b;
b ^= a;
a ^= b;
std::cout << "a = " << a << ", b = " << b << "\n";
要进行正式生产,您需要添加检查以确保可以使用。
void doXORSwap(int& a, int& b){
// 需要添加支票以确保您没有交换相同的内容
//变量本身。否则它将值归零。
if (&a != &b)
{
// 异或交换
a ^= b;
b ^= a;
a ^= b;
}
}
因此,尽管它看起来像是一个很好的隔离技巧,但在实际代码中却没有用。xor不是基本逻辑运算,而是其他运算的组合:a ^ c =〜(a&c)&(a | c)
同样在2015年以后的编译器中,变量可能被分配为二进制:
int cn=0b0111;
以上是 C++ ^-按位XOR(异或) 的全部内容, 来源链接: utcz.com/z/345207.html