
不使用运算符 +
和 -
,计算两整数 a
、b
之和。
示例 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])