int getSum(int a, int b)
{
if(a == 0)
return b;
if(b == 0)
return a;
int lower; //低位
int carrier; //进位
while(true)
{
lower = a ^ b; //计算低位,即无进位的加法的结果
carrier = (a & b) << 1; //计算进位
if(carrier == 0)
break;
//如果进位不等于0,将无进位加法结果和进位相加
a = lower;
b = carrier;
}
return lower;
}
分析:位运算加法无非就4种情况:
a | b | 低位 | 进位 |
0 | 0 | 0 | 0 |
1 | 0 | 1 | 0 |
0 | 1 | 1 | 0 |
1 | 1 | 0 | 1 |
从上面表格可以发现,低位 = a^b,进位 = a&b << 1,之所以要左移以为是因为进位是要加到上一位的,不是加到当前位的。
接下来如果进位不是0的话,还要将之前计算得到的低位和进位相加,如此循环直到进位为0,即得到最终结果。