x+y = ((x&y)<<1) + (x^y) 证明

法一:
我们考虑x,y在二进制表示时候,按位相加
其中第i位
xi+yi = ((xi&yi)<<1) + (xi^yi)
其中(xi&yi)<<1表示当xi和yi都是1是,需要进位1.
     xi^yi表示不考虑进位,当前位的值.
把所有这些数据相加,也就是
x+y = Sum{xi*2^i}+Sum{yi*2^i} = Sum{(xi+yi)*2^i} 
     = Sum{ (((xi&yi)<<1)+(xi^yi))*2^i }
     =Sum{ ((xi&yi)*2)*2^i + (xi^yi)*2^i}
     =Sum{(xi&yi)*2^i}*2 + Sum{(xi^yi)*2^i}
     =(x&y)*2+(x^y)
     =((x&y)<<1)+(x^y)

 

法二:

x = (x&y) + ((x^y)&x)
y = (x&y) + ((x^y)&y)
((x^y)&x) + ((x^y)&y) = x^y 
----------------------------------
x + y = 2 * (x&y) + (x^y)

 

应用:

利用位运算实现两个整数的加法运算

int Add(int a,int b)
{
  if(b == 0) return a; 
  int sun,carry;
  sum = a^b; //完成第1步无进位加法
  caryy = (a&b)<<1; //完成第2步有进位的加法,并进位
  return Add(sum,carry); //进行递归相加
}

 

posted @ 2014-10-07 16:56  zhanbiqiang  阅读(445)  评论(0编辑  收藏  举报