关于xor用于交换两数据

  • A+
所属分类:[开发技巧]
用xor指令可以交换两个数据,而无需求助于的三方变量,xor指令的速度是远远快于赋值指令的。
源码如下 (c version, swap function not the whole program)
void Exchange(int &a, int &b)
{
    a ^= b;                                    //a ^=b 表示 a=a ^ b;     ^表示xor运算;
    b ^= a;
    a ^= b;
}
 
如有a=2,b=3
执行 Exchange(a,b);
后   a=3,b=2
 
若是用汇编将a,b载入寄存器,将更快
(intel 格式)
mov eax, a
mov ebx, b
xor  eax,ebx
xor  ebx,eax
xor  eax,ebx
mov a, eax
mov b, ebx
 
7条cpu指令,当然还可以并发操作
 
 
关于xor交换数据,可以用穷举法证明
如下:
 
设a,b为一二进制位  {0,1}
 
当初始a=0,b=0
a ^= b;               //a=1;  b=0;
b ^= a;               //a=1;  b=0;
a ^= b;               //a=0;  b=0;
结果:a=0;b=0;       可以看作a,b已经交换数据
 
当初始a=1,b=1
a ^= b;               //a=1;  b=1;
b ^= a;               //a=1;  b=1;
a ^= b;               //a=1;  b=1;
结果:a=1;b=1;       可以看作a,b已经交换数据
 
当初始a=0;b=1
a ^= b;               //a=0;  b=1;
b ^= a;               //a=0;  b=0;
a ^= b;               //a=1;  b=0;
结果: a=1;b=0;      交换数据
 
初始a=1;,b=0的情况与上面的相同
证毕!
  • 我的微信
  • 这是我的微信扫一扫
  • weinxin
  • 我的微信公众号
  • 我的微信公众号扫一扫
  • weinxin
广告也精彩
avatar
广告也精彩

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: