没有“temp”的swap


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


刚入门学习写代码时,写一个用来交换两个数的程序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....



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值