一些诡异的与或非计算
2010年11月01日 15:26
1.求两个数的平均数
- int averagePerfect(int a, int b)
- {
- return (a&b) + ((a^b) >> 1);
- }
证明如下:
设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两个数字
- int exchangePerfect(int& a, int& b)
- {
- a=a^b;
- b=a^b;
- a=a^b;
- }
证明如下:
设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]。