stm32 整数加法循环时间_LeetCode 题解 | 371.两整数之和

d37ca45e2e40508e26fdb70426a88486.png

本期精选题解由我们的用户“江五渣”倾情撰写,一起来看看吧!

371.两整数之和

两整数之和 - 力扣(LeetCode)​leetcode-cn.com
7441bbe219628142b3ce0fd929f6c20f.png

题目描述

不使用运算符 +- ,计算两整数 ab 之和。

示例 1:

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

示例 2:

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

解决方案

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

位运算中的加法

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

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。

具体实现

  • Python 实现
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……

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

本文作者:江五渣

​声明:本文归作者版权所有,如需转载请联系。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值