使用异或交换数据的优缺点

使用异或来交换数据只有缺点,没有优点!

家人们,我在刚开始学习到可以使用异或来交换数据的时候,我就潜意识的以为(或者是受身边影响)以为这个方法是最高效最好的,但是后来我就想到运算难道比赋值还快吗,结果恰恰相反,使用异或最多就是不用设置第三个变量,然而它却缺点重重;

交换数据常见的三种方法

第一种,创建第三个变量来交换数据,最原始的方法

int a;int b;
int tem = a;
a = b;
b = tem;

第二种,不创建第三个变量来交换数据,但是可能会导致数据溢出,使程序崩溃

int a;int b;
a = a+b;
b = a-b;
a = a-b;

第三种,也是不创建第三个变量来交换数据,解决了可能数据溢出的风险

int a; int b;
a ^= b;
b ^= a;
a ^= b;

首先讲第三个利用异或来交换数据,之前以为这种方法最好,效率最高

而实际上呢?我们来看看生成的汇编代码

第一种创建第三个变量赋值交换数据的方法

      movl        b, %eax    ;将b从内存载入到寄存器eax
      movl        a, %edx    ;将a从内存载入到寄存器edx
      movl        %eax, a    ;将eax的内容存入到内存a中
      xorl        %eax, %eax ;将eax清零
      movl        %edx, b    ;将edx的内容存入到内存b中

第三种异或运算交换数据的方法;
这个方法在-O2和-O3翻译成汇编:

movl        b, %eax       ;将b从内存载入寄存器eax
movl        a, %ecx       ;将a从内存载入寄存器ecx
movl        %eax, %edx    ;将eax的值保存到edx中
xorl        %ecx, %edx    ;ecx与edx异或
xorl        %edx, %eax    ;edx与eax异或
xorl        %eax, %edx    ;eax与edx异或
movl        %eax, b       ;将eax的值存入到内存b中
xorl        %eax, %eax    ;将eax置0:设置返回值,与上例中一样
movl        %edx, a       ;将edx的值存入到内存a中

原文链接:https://blog.csdn.net/major_zhang/article/details/78616913

以上说明了,异或运算比赋值效率低了很多,并且还有一个缺点,异或运算不能交换float数据

还有一个问题异或运算自己的时候     a^=a;   a会变成0;

所以我觉得正常情况还是得返璞归真,用最原始的方法:创建第三个变量来交换数据是最优解

当然不正常的情况就是数据特别特别大的时候,使用异或可能会好点,当然一般数据是不会那么大

总得来说;以后还是使用第一种最笨的方法好了;使用异或交换数据了解就好了,因为可能面试官会问

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值