异或运算法 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 第二次
异或方法的隐患 在交换数组元素时,下标为i和j的元素,导致有一种情况,当i == j时: swap(data[i], data[j]); 在执行了 arr[i] = arr[i] ^ arr[j] 后,arr[i] = arr[j] = 0。 就有问题了。 标签:arr,变量,int,18,异或,方法 |
|