【剑指Offer-65】不用加减乘除做加法
问题
写一个函数,求两个整数之和,要求在函数体内不得使用 “+”、“-”、“*”、“/” 四则运算符号。
解答
class Solution {
public:
int add(int a, int b) {
while (b) {
int c = (unsigned)(a & b) << 1;
a ^= b;
b = c;
}
return a;
}
};
重点思路
无进位和 与 异或运算 规律相同,进位 和 与运算 规律相同(并需左移一位)。因此,无进位和n
与进位c
的计算公式如下:
由于n(无进位和)+c(进位和)
部分也不能使用加法,我们可以将无进位和与进位和作为新的a
与b
再做相同的计算,直到进位和为0。
由于C++对负数的左移运算没有定义,所以我们要将有符号数转为无符号数,再进行移位操作。