题目描述
写一个函数,求两个整数之和,要求在函数体内不得使用 "+"、"-"、"*"、"/" 四则运算符号。
示例:
1 | 输入: a = 1, b = 1 |
提示:
a,b均可能是负数或0- 结果不会溢出
32位整数
题解
位运算
两个二进制位相加的四种情况如下:
1 | 0 + 0 = 00 |
可以发现,对于整数 a 和 b:
在不考虑进位的情况下,其无进位加法结果为 a ⊕ b。
而所有需要进位的位为 a & b,进位后的进位结果为 (a & b) << 1。
于是,我们可以将整数 a 和 b 的和,拆分为 a 和 b 的 无进位加法 结果与 进位 结果的和。因为每一次拆分都可以让需要进位的最低位至少左移一位,又因为 a 和 b 可以取到负数,所以我们最多需要 n 次拆分即可完成运算,其中 n 是整型的二进制位数,n = 32。
因为有符号整数用补码来表示,所以以上算法也可以推广到 0 和 负数。

1 | public int add(int a, int b) { |
- 时间复杂度: O(n) ,其中 n 是整型的二进制位数,n = 32
- 空间复杂度: O(1)

参考资料
__END__