关于异或交换数据的好处和坏处
最近查阅了许多资料,发现使用异或交换数据只有坏处没有好处(大概只有比较简洁这个优点吧)
最常见的数据交换方式,定义一个临时变量然后进行交换
void swap(int &a, int &b){
int tmp = a;
a = b;
b = tmp;
}
还有比较省变量的方法:
//使用异或运算符来交换数据
void swap(int &a, int &b){
a ^= b;
b ^= a;
a ^= b;
}
//通过两数的和来交换数据
void swap(int &a, int &b){
a = a + b ;
b = a - b;
a = a - b;
}
不知道从哪听来说异或交换数据这种方式效率很高,很快,还节省空间,后来从汇编角度发现,这样子并不快,而且代码量还比第一种方法多,这种方法除了能装杯好像没啥用了。
今天在写选择排序时发现出错了,使用异或交换数据时排序完的数组怎么多了几个零,很奇怪,想了好久,明明都是swap方法啊,怎么第一种swap方法就可以,异或交换就不行呢,debug发现,在使用异或swap的时候,如果a变量和b变量是同一个变量,最后不仅不能交换,还会把他赋值为0,导致数据出错。
总的来说,以后交换数据的时候还是返璞归真选择第一个这个最普通也最常见的方法吧,不过听说面试官很喜欢考这种歪门邪道的东西,知道一下有这种方法就行了,使用的话还是不要用了
参考文章:
https://www.cnblogs.com/zi-xing/p/4542704.html
如有错误欢迎各位大佬指正