记录一下今天碰到的一个小BUG(a^=b^=a^=b)

我们一般情况下交换两个变量a ,b的值都是采用类似下面的情况

int tmp = a;
a = b;
b = tmp;

这种情况实用且简单,但是我之前在书上看到一种很装逼的方法a^=b^=a^=b,这里运用了按位异或操作符,由于^=是先计算右边再计算左边,所以首先是a = a^b,然后是b = b^a,但是这里的a要用前面的那个式子替换,也就变成了b = b^a^b,而异或的性质是两个相同的数异或为0,任何数与0异或等于他本身,所以又化简为b = a,最后计算最前面一个^=,也就是a = a^b,这里等号右边的a要用第一个式子代替,而等号右边的b要用第二个式子代替,也就是变成了a = a^b^a,最后化简就是a = b,这样就完成了两个数的交换。不仅没有使用额外的空间,并且按位异或的效率也很高。当然这这能适用于整数
但是今天我却在使用这个的时候翻车了。是在写排序算法的时候,交换两个值使用这个,但是在这个算法中可能会对同一个值进行交换,不是说对相同值的两个数进行交换,而是对同一个值进行交换。这样会导致这个值最后变成0。

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Little BigUs

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值