剑指 Offer 65. 不用加减乘除做加法
写一个函数,求两个整数之和,要求在函数体内不得使用 “+”、“-”、“*”、“/” 四则运算符号。
示例:
输入: a = 1, b = 1
输出: 2
提示:
- a, b 均可能是负数或 0
- 结果不会溢出 32 位整数
分析
联想一下二进制加法,只要两位同为1,就需要进位,如果不考虑进位,这个位置就是变成了0,显然和异或类似。所以两个数字的异或,就是不计算进位的加法。
然后考虑进位,只有两个都是1的才需要进位,所以想到了与运算,两个位置都是1,与运算结果才是1。又因为进位需要左移,所以与运算后左移一位就是进位。
进位得到的数字和不进位的数字加一起,就是两个数的和。重复上述过程,直到进位为0,即完成加法运算。
代码
class Solution {
public int add(int a, int b) {
//把b当做进位。直到进位等于0时,直接异或就是结果。
while(b!=0){
//求不进位的和
int sum = a^b;
//求进位
b = (a&b)<<1;
a = sum;
}
return a;
}
}