交换两数异或方法和临时变量方法对比
异或运算法
void swap(int &a, int &b) { a = a^b; b = a^b; a = a^b; }
临时变量方法
void swap(int &a, int &b) { int tmp = a; a = b; b = tmp; }
异或方法的缺点
对于临时变量法,每次赋值只要读取一个变量的值到寄存器,
然后再从寄存器写回到另一个变量中即可,前后涉及两次内存写入操作;
但是对于异或运算操作,每次都需要读取两个数据到寄存器中,再进行运算操作,
之后把结果写回到变量中,前后共需要三次内存写入操作。
另外一点,异或操作的代码可读性差。
理论上是临时变量法快,实际呢,可以编一段代码测试一下:
void XorSwapTest() { int i = 3; int j = 5; for (int x = 0;x < 100000000;x++) { i = i ^ j; j = i ^ j; i = i ^ j; } } void TmpSwapTest() { int i = 3; int j = 5; for (int x = 0;x < 100000000;x++) { int k = i; i = j; j = k; } }
对比通过xor方法交换数值,和通过临时变量方法交换数值哪个更快:
循环100000000次,测试了两次,
第一次:
XOR 18:51:30:5509->18:51:31:0609 =5100
TMP 18:51:31:0609->18:51:31:2879 =2270
第二次
XOR 18:53:39:7497->18:53:40:2087 =4590
MP 18:53:40:2087->18:53:40:4457 =2370
可以发现,临时变量方法确实比异或方法快,异或方法多用时一倍多
异或方法的隐患
在交换数组元素时,下标为i和j的元素,导致有一种情况,当i == j时:
swap(data[i], data[j]);
在执行了 arr[i] = arr[i] ^ arr[j] 后,arr[i] = arr[j] = 0。
就有问题了。