交换两数异或方法和临时变量方法对比
异或运算
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
;
}
异或方法的缺点
对于临时变量法,每次赋值只要读取一个变量的值到寄存器,然后再从寄存器写回到另一个变量中即可,前后涉及两次内存写入操作;但是对于异或运算操作,每次都需要读取两个数据到寄存器中,再进行运算操作,之后把结果写回到变量中,前后共需要三次内存写入操作。另外一点,异或操作的代码可读性差。 参考 链接
异或方法的隐患
现在交换arr数组下标为i和j的元素,为了简化代码,没有对i和j相等的情况作特殊处理,导致有一种情况,i == j下:
swap(data
[i
], data
[j
]);
在执行了 arr[i] = arr[i] ^ arr[j] 后,arr[i] = arr[j] = 0。