【剑指Offer】面试题65. 不用加减乘除做加法
题目
写一个函数,求两个整数之和,要求在函数体内不得使用 “+”、“-”、“*”、“/” 四则运算符号。
示例:
输入: a = 1, b = 1
输出: 2
提示:
- a, b 均可能是负数或 0
- 结果不会溢出 32 位整数
思路
普通十进制相加过程:
(1)各位相加,无进位(2)计算进位值(3)无进位和加上进位值
二进制相加过程:
(1)两个二进制数异或模拟无进位相加,得到无进位和(2)二进制各位与再左移,计算进位(3)无进位和与进位异或
重复以上操作,直到进位不为0。
代码
时间复杂度:O(1)
空间复杂度:O(1)
class Solution {
public:
int add(int a, int b) {
int sum, carry;
while (b != 0) {
sum = a ^ b;
carry = (unsigned int)(a & b) << 1;//表示进位
a = sum;
b = carry;
}
return a;
}
};