【Practical】异或运算

  • 相同为 0 0 0,相异为 1 1 1,C++中使用 ^ 表示异或运算,例如:1100 ^ 0101 = 1001.
  • 异或运算的性质有:任何数和自己进行异或必然得到 0 0 0,任何数和 0 0 0 异或必然得到自身。
  • 基于上述性质可以得到一种基于异或运算的交换两个变量数值的方法,一般的方法需要借助中间变量:
#include<iostream>
using namespace std;

int main() 
{
	int a = 3;
	int b = 5;

	cout << "a:" << a << " b:" << b << endl;

	int tmp = a;
	a = b;
	b = tmp;

	cout << "a:" << a << " b:" << b << endl;

	return 0;
}
  • 使用异或运算可以无需定义中间变量:
#include<iostream>
using namespace std;

int main() 
{
	int a = 3;
	int b = 5;

	cout << "a:" << a << " b:" << b << endl;

	a = a ^ b;
	b = a ^ b;
	a = a ^ b;

	cout << "a:" << a << " b:" << b << endl;

	return 0;
}
  • 第一步 a' = a ^ b 使得第二步实际运算的数值为 b' = a ^ b ^ b = a,是 a a a 原本的数值,而第三步实际运算的数值为 a'' = a' ^ b' = a ^ b ^ a = b,是 b b b 原来的数值,从而实现交换。这相当于如下的代码:
a = a + b;
b = a - b;
a = a - b;
  • 并且使用异或还不会发生溢出的情况,例如两个变量 a , b a,b a,b 均为无符号整数时,加法可能会导致上述第一行代码数值溢出。

上一篇:nf_conntrack: falling back to vmalloc.


下一篇:Practical Training YueCe-1