【只争朝夕】

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

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

异或运算法

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。

就有问题了。

posted on 2022-08-05 18:42  【只争朝夕】  阅读(102)  评论(0编辑  收藏  举报