一些诡异的与或非计算

2010年11月01日 15:26

1.求两个数的平均数

  1. int averagePerfect(int a, int b)  
  2. {  
  3.     return (a&b) + ((a^b) >> 1);  
  4. }  

证明如下:

设a各个位为a[31]a[30]a[29]......a[0],同理b设为b[31]b[30]b[29]......b[0]。则c=(a+b)>>1。

c[n]=(a[n]+b[n]的高位)+(a[n+1]+b[n+1]的低位)=(a[n+1]^b[n+1]>>1)+(a[n]&b[n])。

故c=(a&b)+((a^b)>>1)。

2.交换a,b两个数字

  1. int exchangePerfect(int& a, int& b)  
  2. {  
  3.     a=a^b;
  4.     b=a^b;
  5.     a=a^b;
  6.  }  

证明如下:

设a各个位为a[31]a[30]a[29]......a[0],同理b设为b[31]b[30]b[29]......b[0]。

a=a^b:a[n]=a[n]^b[n]

b=a^b:b[n]=a[n]^b[n] ^b[n]=a[n]

a=a^b:a[n]=a[n]^b[n] ^a[n]^b[n] ^b[n]=a[n]^b[n]^a[n]=b[n]^a[n]^a[n]=b[n]

如此便完成了交换。

我们尝试证明更加一般的东西

a+b=

设a各个位为a[31]a[30]a[29]......a[0],同理b设为b[31]b[30]b[29]......b[0]。