交换两个变量,只使用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 }

 

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

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

posted @ 2017-03-21 13:22  Crystal_Guang  阅读(335)  评论(0编辑  收藏  举报