Loading

不使用+-*/计算两数之和

不用加减乘除做加法

写一个函数,求两个整数之和,要求在函数体内不得使用 “+”、“-”、“*”、“/” 四则运算符号。

示例:

输入: 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;
    }
}
posted @ 2020-10-06 11:44  codeduck  阅读(419)  评论(0编辑  收藏  举报