交换两数方法对比

交换两数异或方法和临时变量方法对比

异或运算

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。

你可能感兴趣的:(基础算法)