分享

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

 印度阿三17 2022-08-14 发布于重庆


异或运算法

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。

就有问题了。

标签:arr,变量,int,18,异或,方法
来源: https://www.cnblogs.com/sinceret/p/16555469.html 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多