不借助第三个变量实现两个值的交换

不借助第三个变量实现两个值的交换

交换两个数最常用的是借助第三个变量来实现,或者借助其它数据结构(其实也就是借助第三方来实现暂存数据)。那么如何不借助第三方实现交换两个数据呢?

方法一:利用两个值的差值来实现

原理:假如a = 5, b = 7;那么ab大小差2。已知一个变量的值,通过与另外一个变量的差值就可以知道另外的值。

  1. 可以先让a暂存与b的差值,a = b - a;a = 2;
  2. 然后将a的值赋值给b,b = b - a;b = 5;
  3. 最后在利用差值将b赋值给a;a = b + a;a = 7;
template <typename T>
void swapTwo(T &a, T &b)
{
    a = b - a;
    b = b - a;
    a = b + a;
}

方法二:位运算异或

原理:对与整型值,都是二进制值,比如5是0101,7 是0111。5和7异或,只有在两个比较的位不同时其结果是1,否则结果为0,所以5^7 => 0101 ^ 0111 = 0010。对于异或有个特点就是,一个数连续异或两个相同的数那么值等于它本身。5 ^ 7 ^ 7 => 0010 ^ 0111 = 0101 = 5。

template <typename T>
void swapTwo(T &a, T &b)
{
    a = a ^ b;
    b = a ^ b; // 等价于b = a ^ b ^ b = a
    a = a ^ b; // 等价于a = a ^ b ^ a = b
}
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值