加载中...
371-两整数之和(Sum of Two Integers)
发表于:2021-12-03 | 分类: 中等
字数统计: 842 | 阅读时长: 3分钟 | 阅读量:

原文链接: https://leetcode-cn.com/problems/sum-of-two-integers

英文原文

Given two integers a and b, return the sum of the two integers without using the operators + and -.

 

Example 1:

Input: a = 1, b = 2
Output: 3

Example 2:

Input: a = 2, b = 3
Output: 5

 

Constraints:

  • -1000 <= a, b <= 1000

中文题目

给你两个整数 ab不使用 运算符 + 和 - ​​​​​​​,计算并返回两整数之和。

 

示例 1:

输入:a = 1, b = 2
输出:3

示例 2:

输入:a = 2, b = 3
输出:5

 

提示:

  • -1000 <= a, b <= 1000

通过代码

高赞题解

题目说不能使用运算符 +-,那么我们就要使用其他方式来替代这两个运算符的功能。

位运算中的加法

我们先来观察下位运算中的两数加法,其实来来回回就只有下面这四种:

0 + 0 = 0
0 + 1 = 1
1 + 0 = 1
1 + 1 = 0(进位 1)

仔细一看,这可不就是相同位为 0,不同位为 1 的异或运算结果嘛~

异或和与运算操作

我们知道,在位运算操作中,异或的一个重要特性是无进位加法。我们来看一个例子:

a = 5 = 0101
b = 4 = 0100

a ^ b 如下:

0 1 0 1
0 1 0 0
-------
0 0 0 1

a ^ b 得到了一个无进位加法结果,如果要得到 a + b 的最终值,我们还要找到进位的数,把这二者相加。在位运算中,我们可以使用操作获得进位:

a = 5 = 0101
b = 4 = 0100

a & b 如下:

0 1 0 1
0 1 0 0
-------
0 1 0 0

由计算结果可见,0100 并不是我们想要的进位,1 + 1 所获得的进位应该要放置在它的更高位,即左侧位上,因此我们还要把 0100 左移一位,才是我们所要的进位结果。

那么问题就容易了,总结一下:

  1. a + b 的问题拆分为 (a 和 b 的无进位结果) + (a 和 b 的进位结果)
  2. 无进位加法使用异或运算计算得出
  3. 进位结果使用与运算移位运算计算得出
  4. 循环此过程,直到进位为 0

在 Python 中的特殊处理

在 Python 中,整数不是 32 位的,也就是说你一直循环左移并不会存在溢出的现象,这就需要我们手动对 Python 中的整数进行处理,手动模拟 32 位 INT 整型。

具体做法是将整数对 0x100000000 取模,保证该数从 32 位开始到最高位都是 0。

具体实现

[]
class Solution(object): def getSum(self, a, b): """ :type a: int :type b: int :rtype: int """ # 2^32 MASK = 0x100000000 # 整型最大值 MAX_INT = 0x7FFFFFFF MIN_INT = MAX_INT + 1 while b != 0: # 计算进位 carry = (a & b) << 1 # 取余范围限制在 [0, 2^32-1] 范围内 a = (a ^ b) % MASK b = carry % MASK return a if a <= MAX_INT else ~((a % MIN_INT) ^ MAX_INT)

当然,如果你在 Python 中想要偷懒也行,毕竟 life is short……

[]
class Solution(object): def getSum(self, a, b): """ :type a: int :type b: int :rtype: int """ return sum([a, b])

统计信息

通过次数 提交次数 AC比率
83109 135564 61.3%

提交历史

提交时间 提交结果 执行时间 内存消耗 语言

相似题目

题目 难度
两数相加 中等
上一篇:
367-有效的完全平方数(Valid Perfect Square)
下一篇:
372-超级次方(Super Pow)
本文目录
本文目录