法一:
我们考虑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); //进行递归相加 }