不使用临时变量的swap再思考 -- 六种解法

本文探讨了不使用临时变量进行swap操作的六种方法,包括乘除法和位运算。这些方法在特定情况下,如浮点数,可能适用。需要注意的是,当a等于b时,某些方法可能会失效。
摘要由CSDN通过智能技术生成

不使用临时变量的swap



一道经典的面试题如下:两个int型变量a和b,不使用临时变量,交换它们的值。
答案相信大家都耳熟能详了:
a = a ^ b;
b = a ^ b;
a = a ^ b;

这段程序巧妙的安排运算顺序利用仅有的两个变量实现swap,它相当于这样一段程序:
c = a ^ b;
b = c ^ b;
a = c ^ b;

可以发现它的技巧简单的说就是把本应放在临时变量c中的值放在了原有变量a中,a的值被覆盖。不过为什么a的值可以被覆盖掉呢?对这段程序一种比较technical的解释就是,它利用了 ^ (异或)运算的性质:
c = a ^ b  =>
   a = b ^ c
   b = a ^ c

但是,大家怎么想起来使用异或呢?使用异或有什么好处呢?两个变量既然要交换,那总归是要赋值的,而在C语言中有不能像Python那样直接一句搞定:
a , b = b , a

所以有这么一个结论:两个变量的最终赋值肯定是有先后顺序的。设a、b的初始值为A、B。假设b先完成赋值,即b已经存储了a的初始值A,现在要把b的初始值B放到a里面去。这时候可用的变量只有a了。也就是说在b完成赋值之后&#
  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值