百度空间 | 百度首页 
 
查看文章
 
有关变量交换
2009-10-31 08:38
论坛里有同学问到IB提到过的那个比较神奇的变量交换函数:
void exchange(int& a, int& b)
{ assert(&a != &b); a^=b; b^=a; a^=b; }
这样为什么能达到交换的目的,其实我们写开来就明白了。

注意XOR运算有一个特性,当一个数a和b异或后,再异或b又会得a,那么结合异或的结合律,有:

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

显然完成了交换。

类别:默认分类 | 添加到搜藏 | 浏览() | 评论 (11)
 
最近读者:
 
网友评论:
1
2009-10-31 10:20 | 回复
............
 
2
2009-10-31 12:34 | 回复
和我没关系
 
3
2009-10-31 16:27 | 回复
回复iceboy:你写的,跟你有关系。别跑啊。晕
ib必须负责
 
4
2009-10-31 16:38 | 回复
注意XOR运算有一个特性,当一个数a和b异或后,再异或b又会得a,那么结合异或的结合律

这个特性很重要
light为人做事,从来不讲架子
平易近人,值得大家尊敬啊。
感觉很幸运的认识到这么一位高人。

荣幸之中。感觉,实乃0ginr的一大幸。
灰常感谢 lighting 对与简单问题的点拔,对于菜鸟的鼓励。
 
5
2009-10-31 16:39 | 回复
错了,名字给大侠叫错了
是 lightning 得罪得罪
 
6
2009-10-31 17:03 | 回复
这段代码还有那个经典的用加减法运算的代码都是有副作用的。试下这个



#include <stdio.h>


void exchange(int& a, int& b)
{ a^=b; b^=a; a^=b; }




int main()
{
   int v=2;
   int &a=v,&b=v;
   a=v;b=v;
   printf("%d,%d\n", a, b);
   exchange(a, b);
   printf("%d,%d\n", a, b);
   getchar();
   return 0;
}
 
7
2009-10-31 17:04 | 回复
呃,naive了。才注意到这行




assert(&a != &b)
 
8
2009-11-01 07:33 | 回复
注意XOR运算还有一个特性, a XOR a = 0.
 
9
2009-11-01 07:34 | 回复
RE8:注意代码中的这一行:
assert(&a != &b)
 
10
2009-11-01 08:38 | 回复
 
11
2009-11-01 12:31 | 回复
回复aegisys:;)
 
发表评论:
姓 名:
网址或邮箱: (选填)
内 容:
验证码: 请点击后输入四位验证码,字母不区分大小写
      

     

©2009 Baidu