Leetcode 371.两整数之和 By Python

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

示例 1:

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

示例 2:

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

思路

比如(5+6=11)

我们可以按照如下步骤:

  • 先不考虑进位为1
  • 考虑进位之后(10+1=11)
  • 直到没有进位的情况出现才结束

二进制也是类似处理:

  • 先“按位加”,也就是异或,在python中为^
  • 处理进位,进位就是和,在python中为&,还要左移<<1位
  • 循环上述步骤就好了

要特别注意的是:

python中一直左移是不会溢出的,所以要手动模拟32位int型

代码

class Solution(object):
    def getSum(self, a, b):
        """
        :type a: int
        :type b: int
        :rtype: int
        """
        MAX_INT = 0x7FFFFFFF    #int类型最大的值
        MIN_INT = MAX_INT + 1
        MASK = 0x100000000		#等于2^32,1-32位上都是1
        while b != 0:
            carry = (a & b) << 1	#表示进位
            a = (a ^ b) % MASK	#对其取余则将范围限制在[0,2^32-1]内,也就是int的范围
            b = carry % MASK	#同理
        return a if a <= MAX_INT else ~((a % MIN_INT) ^ MAX_INT)	

#如果小于MAX_INT就不用处理了,如果溢出就要:
#以4位bit为例,从0000-1111,可以表示的范围为[0,15],如果计算出16那就是溢出了,16是10000,此时的MIN_4BIT为16,取余为0,0000异或1111为1111再取反就是0了,将范围限制在了4位bit的范围内

当然你也可以这么偷懒哈哈哈哈哈哈哈

class Solution(object):
    def getSum(self, a, b):
        """
        :type a: int
        :type b: int
        :rtype: int
        """
        return sum([a,b])
原文地址:https://www.cnblogs.com/MartinLwx/p/9719576.html