跳至主要內容

0371. 两整数之和

ITCharge大约 2 分钟

0371. 两整数之和open in new window

  • 标签:位运算、数学
  • 难度:中等

题目链接

题目大意

描述:给定两个整数 aabb

要求:不使用运算符 +- ,计算两整数 aabb 的和。

说明

  • 1000a,b1000-1000 \le a, b \le 1000

示例

  • 示例 1:
输入:a = 1, b = 2
输出:3
  • 示例 2:
输入:a = 2, b = 3
输出:5

解题思路

思路 1:位运算

需要用到位运算的一些知识。

  • 异或运算 a ^ b:可以获得 a+ba + b 无进位的加法结果。
  • 与运算 a & b:对应位置为 11,说明 aabb 该位置上原来都为 11,则需要进位。
  • 左移运算 a << 1:将 aa 对应二进制数左移 11 位。

这样,通过 a ^ b 运算,我们可以得到相加后无进位结果,再根据 (a & b) << 1,计算进位后结果。

进行 a ^ b(a & b) << 1 操作之后判断进位是否为 00,若不为 00,则继续上一步操作,直到进位为 00

注意:

Python 的整数类型是无限长整数类型,负数不确定符号位是第几位。所以我们可以将输入的数字手动转为 3232 位无符号整数。

通过 a &= 0xFFFFFFFF 即可将 aa 转为 3232 位无符号整数。最后通过对 aa 的范围判断,将其结果映射为有符号整数。

思路 1:代码

class Solution:
    def getSum(self, a: int, b: int) -> int:
        MAX_INT = 0x7FFFFFFF
        MASK = 0xFFFFFFFF
        a &= MASK
        b &= MASK
        while b:
            carry = ((a & b) << 1) & MASK
            a ^= b
            b = carry
        if a <= MAX_INT:
            return a
        else:
            return ~(a ^ MASK)

思路 1:复杂度分析

  • 时间复杂度O(logk)O(\log k),其中 kkintint 所能表达的最大整数。
  • 空间复杂度O(1)O(1)