交换两个变量,只使用2个变量——权当面试了解使用

数学分析法:

 1 #include<stdio.h>  
 2 int main()
 3 {
 4     int a = 10;
 5     int b = 20;
 6     a = a + b;
 7     b = a - b;
 8     a = a - b;
 9     printf("a=%d b=%d\n", a, b);
10 
11     return 0;
12 }

我们知道两个加数,一定可以交换它们的值。a+b求得它们的和,比如为sum,但我们完全可以不再定义一个变量sum,而赋值给a或者b都是可以的,为什么呢?因为知道两个数的和,以及其中一个加数,一定可以得到另一个数。所以就算先覆盖一个加数也是无所谓的。得到a+b的和赋值给a之后,要把a和b交换,只用将a(sum)减去b,此时减出来的结果相当于最初的a(10),赋值给b了。道理很简单,a+b=sum;那么一定有sum-b=a。6-7行之后,a还是sum,b已经是之前的a了,最后就该把最初的b赋值给a了,已经很简单,和与加数知道两个即可,此时a(sum=30)-b(此时已经是a了,b=10),要交换,只用把a(sum=30)-b(10)赋值给a,这样就达到两个变量交换的目的了。

为了锻炼思维,可把上面第6行变成:b=a+b;那么后面该怎么写?如果理解了的话应该是不困难的。

 

eg:

b = a + b;
a = b - a;
b = b - a;

但是这样的方法有一点不好,就是可能会有溢出,万一两个int相加大于最大的数了,这个方法就失效了。

 

 

所以,需要另外一种方法:

异或:相同为0,不同为1.即1^1=0;1^0=1。X^0=X,a^b=b^a,a^b^c=(a^b)^c=a^(b^c).

 1 #include<stdio.h>  
 2 int main()
 3 {
 4     int a = 1;
 5     int b = 2;
 6     a = a ^ b;
 7     b = a ^ b;
 8     a = a ^ b;
 9     printf("a=%d b=%d\n", a, b);
10 
11     return 0;
12 }

 

只用将上面的减号变成异或(^)就可以实现交换,上诉代码其实是第一种方式的翻版。

但通过汇编代码发现,少一个变量,并不意味着更快。这个方式,只是为了可能的面试题。实际开发中,还是用三个变量转换的更好。

转载于:https://www.cnblogs.com/yangguang-it/p/6593856.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值