交换函数

交换两个数的值是一种很常见的操作,一般情况下我们进行交换两个数的值都会创建一个临时变量,然后进行循环赋值,在加上泛型编程的思想,就像下面的代码。

1 template 
2 Swap(T & a,T & b)
3 {
4     T tmp = a ;
5     a = b ;
6     b = tmp ;
7 }

但是某些面试或者钻研算法的人的思想就比较独特,或者说看你的想法有没有那么多。所以就提出了一个问题,能不能在不使用临时变量的方法就可以将两个数进行交换,从而达到一个节省空间的

目的,所以我们就要考虑一下这个在不使用临时变量的情况下,我们怎么用两个变量完成这一系列的操作。此时我们只有两个变量,如果将两个值分别保存在一个变量中,那么就肯定是无法完成交换的,这个时候我们就要想想,能不能用一个变量保存两个值,一个变量保存一个值。参考下面的代码

1 void  Swap(int &a, int &b)
2 {
3     a = a + b;
4     b = a - b;
5     a = a - b;
6 }

我们使用一个变量保存了两个值,在通过相减就实现了两个变量之间的交换。但是这样的话问题也是有的,因为两个变量进行了相加的操作,所以就会产生溢出的后果。如何在避免溢出的情况下交换两个变量的值,这个时候就需要用到位运算。代码如下

1 void  Swap(int &a, int &b)
2 {
3     a = a ^ b;
4     b = a ^ b;
5     a = a ^ b;
6 }

通过两个变量之间的异或操作就可以实现两个变量之间的交换。采用异或的方式可以很好的避免溢出的情况,只要给的值没有溢出,那么通过函数进行交换也绝对不会产生溢出。

 

你可能感兴趣的:(交换函数)