a ^ b中的^操作符将a对象与b对象的对应二进制位逐一进行按位异或(xor)运算。当且仅当a与b中的对应二进制位不同时,结果位为1,否则为0。

版权声明

本文可以在互联网上自由转载,但必须:注明出处(作者:海洋饼干叔叔)并包含指向本页面的链接。

本文不可以以纸质出版为目的进行改编、摘抄。

  对于单个比特位的^运算,可以总结其规则如下:

1 ^ 1 = 0 1 ^ 0 = 1
0 ^ 1 = 1 0 ^ 0 = 0

  下述程序演示了按位异或操作符^的使用方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//Project - BitXor
#include <iostream>
#include <bitset>
using namespace std;

int main() {
unsigned char a = 0xb4;
unsigned char b = 0x77;

unsigned char c = a ^ b;
cout << "a = " << bitset<8>(a) << endl;
cout << "b = " << bitset<8>(b) << endl;
cout << "a ^ b = " << bitset<8>(c) << endl;

return 0;
}

上述程序的执行结果为:

1
2
3
a     = 10110100
b = 01110111
a ^ b = 11000011

  请读者结合执行结果的每一位对照检查其与操作数a、b对应位之间的关系。类似地,a ^= b中的^=是个复合操作符,等价于a = a ^ b。

  灵活地运用异或运算,也可以达成某些神奇的效果,见下述程序。

1
2
3
4
5
6
7
8
9
10
11
12
13
//Project - BitXor2
#include <iostream>
#include <bitset>
using namespace std;

int main(){
unsigned char a = 0xaa;
unsigned char b = 0xf0;
cout << "a = " << bitset<8>(a) << endl;
cout << "b = " << bitset<8>(b) << endl;
cout << "a^b = " << bitset<8>(a^b) << endl;
return 0;
}

  如果读者仔细观察执行结果,可以发现:

  • b的高4位全是1,a^b把a的高4位1010取反,得0101;

  • b的低4位全是0,a^b的低4位同a的低4位相同,仍为1010。

  客观上,上述程序达到了将a的高4位取反,而低4位不变的目的。而哪些位取反,哪些位不变,则由b的二进制值来确定:为1的对应位取反,为0的对应位不变。