Chinaunix首页 | 论坛 | 博客
  • 博客访问: 169946
  • 博文数量: 49
  • 博客积分: 2802
  • 博客等级: 大尉
  • 技术积分: 502
  • 用 户 组: 普通用户
  • 注册时间: 2009-09-25 12:02
个人简介

来就来吧

文章分类

全部博文(49)

文章存档

2014年(1)

2012年(1)

2011年(11)

2010年(26)

2009年(10)

分类: C/C++

2010-02-24 10:41:52

实际上是数学知识了
1.一个数与本身的异或是0,即:a^a = 0
2.一个数与0异或,则不变,即: a^0 = a
3.任何一位二进制数同 1 异或都会变成另外一个
4.任何一位二进制数同 0 异或都保持不变

void swap(int a,int b)
{
    a = a^b;
    b = a^b;
    a = a^b;
    printf("a = %d, b = %d\n",a,b);
}

数学上
b = (a^b) ^b  = a;

有点绕,但仔细思考一下,还是可以知道的。

实际上,这样做交换效率不高。有人进行1亿次运行测算了一下。
int a = 1, b = 2, tmp

{ a ^= b ^= a ^= b; }
real = 0.896, user = 0.892, sys = 0.001;

{ tmp = a;
   a = b;
   b = tmp; }
real =0.292, user = 0.289, sys = 0.002;


这种情况只在对存储器使用要求极端严格的,会用这种牺牲效率换取空间的做法。
貌似单片机中会使用。



阅读(1012) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~