题目描述:
写一个函数,求两个整数之和,要求在函数体内不得使用 “+”、“-”、“*”、“/” 四则运算符号。
示例1:
输入: a = 1, b = 1
输出: 2
提示:
- a, b 均可能是负数或 0
- 结果不会溢出 32 位整数
解题思路:
1、位运算:
当要求不能使用加减乘除四则运算时,可以很自然地想到使用位运算。
使用位运算对两个整数进行加法运算有两个地方需要考虑,就是相同数位相加后的结果以及产生进位,即无进位和n
和以及进位和c
。
a(i) | b(i) | 无进位和n(i) | 进位和c(i+1) |
---|---|---|---|
0 | 0 | 0 | 0 |
0 | 1 | 1 | 0 |
1 | 0 | 1 | 0 |
1 | 1 | 0 | 1 |
根据上述真值表,无进位和n的计算公式为:n = a ^ b
;进位和c的计算公式为:c = (a & b) << 1
。
因此可以将s = a + b
转化为s = n + c
,当没有产生进位,即进位和c == 0
时,计算结束。具体实现可以参见实现代码。
时间复杂度和空间复杂度: 时间复杂度为O(N),空间复杂度为O(1)。
实现代码:
//解法1:位运算
public int add(int a, int b) {
while(b != 0){//进位和为0计算结束
int c = (a & b) << 1;//进位和
a = a ^ b;//无进位和
b = c;
}
return a;
}