1.题目地址
2.题目描述
写一个函数,求两个整数之和,要求在函数体内不得使用 “+”、“-”、“*”、“/” 四则运算符号。
示例:
输入: a = 1, b = 1
输出: 2
提示:
a, b 均可能是负数或 0
结果不会溢出 32 位整数
3.思路
使用位运算。
异或运算^:第一个操作数的第n位于第二个操作数的第n位相反,那么结果的第n位也为1,否则为0。
与运算&:第一个操作数的第n位与第二个操作数的第n位都为1,那么结果的第n位也为1,否则为0。
"<<"左移:无论正负数,后面补零。
因此无进位和与异或运算^相同。进位和与于运算&相同。因此a+b=无进位和+进位。然后进入递归,将每次无进位和赋给a,进位和赋给b,直到b为0时,说明无进位了,运算完毕,将a返回。
力扣图示
4.代码
//a+b=无进位和(异或运算^)+进位和(与运算&)
public int add(int a, int b) {
//递归直到b==0说明当前无进位了。
if (b == 0) {
return a;
}
return add(a ^ b, (a & b) << 1);
}