通过异或交换值

来源:互联网 发布:淘宝客选什么推广 编辑:程序博客网 时间:2024/06/06 08:52

用法:

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

通用一点的形式是:

               a^b=c

      a^c=b 同时 b^c=a


即只要直到a,b,c中的任意两个,通过异或运算就可以算出另一个。

(这是磁盘位的恢复的一种手段。)


原理如下(摘录):
^ 是按位异或操作符。两数相同的话异或的结果就是 0,否则是 1。举个例子,比如 a 表示十进制的 5,b 表示十进制的 12,按位异或结果就是:

a = 0101   (5 的二进制表示)
b = 1100   (12 的二进制表示)
    ----
c = 1001   (结果为 9)

有两个定理:
任何一位二进制数同 1 异或都会变成另外一个(0 同 1 异或的结果是 1,1 同 1 异或的结果是 0)
任何一位二进制数同 0 异或都保持不变(0 同 0 异或的结果是 0,1 同 0 异或的结果是 1)

因为 c 中是 1 的部分表示 a 和 b 中按位不同的位,0 表示 a 和 b 中按位相同的位,那么 a 同 c 异或的结果就是 a 中与 b 不同的位发生变化,二进制数每位只有两种状态,所以 a 变成了 b:

a = 0101
c = 1001
    ----
b = 1100

同样, b 与 c 异或结果就变成了 a:

b = 1100
c = 1001
    ----
a = 0101

原创粉丝点击