Java教程

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

本文主要是介绍交换两数异或方法和临时变量方法对比,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

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

异或运算法

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。

就有问题了。

这篇关于交换两数异或方法和临时变量方法对比的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!