使用异或来交换数据只有缺点,没有优点!
家人们,我在刚开始学习到可以使用异或来交换数据的时候,我就潜意识的以为(或者是受身边影响)以为这个方法是最高效最好的,但是后来我就想到运算难道比赋值还快吗,结果恰恰相反,使用异或最多就是不用设置第三个变量,然而它却缺点重重;
交换数据常见的三种方法
第一种,创建第三个变量来交换数据,最原始的方法
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;
所以我觉得正常情况还是得返璞归真,用最原始的方法:创建第三个变量来交换数据是最优解
当然不正常的情况就是数据特别特别大的时候,使用异或可能会好点,当然一般数据是不会那么大
总得来说;以后还是使用第一种最笨的方法好了;使用异或交换数据了解就好了,因为可能面试官会问