不使用+-*/计算两数之和
不用加减乘除做加法
写一个函数,求两个整数之和,要求在函数体内不得使用 “+”、“-”、“*”、“/” 四则运算符号。
示例:
输入: a = 1, b = 1
输出: 2
提示:
a
,b
均可能是负数或 0- 结果不会溢出 32 位整数
解题思路:
计算 5 + 17 其二进制为 00101 + 10001
# 1.对两个二进制数的每一位相加,而不进位,其本质就是异或运算
10001 ^ 00101 = 10100
10001
00101
------
10100
# 2. 对两个二进制数进行与运算,然后左移一位
10001 & 00101 << 1
10001
00101
------
00001 << 1 = 00010
# 3. 将1和2两个计算结果进行求和,求和的过程依然是1,2两个步骤。此时计算步骤1时已经不产生进位,所以异或结果就是求和结果,执行2步骤的结果为0,依此条件可以退出循环
10100
00010
------
10110 = 22 = 5 + 17
# 在计算机系统中,数值一律用 补码 来表示和存储。补码的优势: 加法、减法可以统一处理(CPU只有加法器)。因此,以上方法 同时适用于正数和负数的加法 。
class Solution {
public int add(int a, int b) {
int sum, carry;
do {
sum = a ^ b;
carry = (a & b) << 1;
a = sum;
b = carry;
}while (b != 0);
return a;
}
}