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 = false true OR false = true false OR false = false
请注意,对于XOR操作,与在操作trueORtrue=false中一样trueAND/ORtrue=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
逐位异或可以多种方式使用,并且经常在位掩码操作中用于加密和压缩。
注意:以下示例通常作为一个很好的技巧示例显示。但不应在生产代码中使用(有更好的方法可以达到相同的结果)。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;