没有“temp”的swap

来源:互联网 发布:网络电话机终端 编辑:程序博客网 时间:2024/04/30 17:15


在这里只是记下在看书时留意到的一个有趣的小程序


刚入门学习写代码时,写一个用来交换两个数的程序swap是很常见的例子,而一般这个代码程序是这么写的(用c++语言来实现)

void swap(int *a, int *b){         int temp;        temp = *a;        *a = *b;        *b = temp;}
这个程序是一个很自然的想法。把a放到一个临时变量里去,然后把b赋值给a,然后再把临时变量,即原本的a赋值给b。于是完成了两个数之间的交换。


在这里,不知道有没人想过,能不能不引用第三个变量,即不用temp,只有a和b就完成整个swap过程呢?

呵呵,今天看的例子就是这么实现的。他通过引用布尔操作,对变量的位进行操作来实现。C++代码如下:

void swap(int *a, int *b){        *a = *a ^ *b;        *b = *a ^ *b;        *a = *a ^ *b;}
其实在上面整个函数里,就用到了 ^ (异或)操作来实现两个数之间的交换。

b = (a ^ b) ^ b = a ^ (b ^ b) = a ^ 0 = a;

a = (a ^ b) ^ ((a ^ b) ^ b) = (a ^ b) ^ a = (a ^ a) ^ b = b;


于是,通过对位进行操作,整个swap操作就没有引用其他临时变量而完成。

不过,这种方法相对于前者并没有什么性能上的优越,it is merely an intellectual amusement....