异或交换

1086阅读 0评论2010-02-24 zhxw123
分类:C/C++

实际上是数学知识了
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;


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



上一篇:div css 居中, 兼容ff
下一篇:div嵌套div margin-top