关于异或交换数据的好处和坏处

关于异或交换数据的好处和坏处

最近查阅了许多资料,发现使用异或交换数据只有坏处没有好处(大概只有比较简洁这个优点吧)

最常见的数据交换方式,定义一个临时变量然后进行交换

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

如有错误欢迎各位大佬指正

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值