依旧是leetcode的简单题,这道题要求我们不能使用+、-来完成数的加减,毫无疑问,需要用到位运算来解决,思路OK的,但是在实现上思路没缕清晰,而且Python在实现这道题上需要考虑的问题比较复杂。
leetcode链接:https://leetcode-cn.com/problems/sum-of-two-integers/description/
先说说位运算的思路吧,一共有两个部分:
1,按位异或运算,得到的是不考虑进位情况下的结果
2,按位与运算,再左移一位,得到所有的进位情况以及进位位置
3,把1和2得到的结果看成两个待相加的数,进行循环或者递归(当有一个数为0,return另一个数)
如果用C写应该很简单,但是Python有个问题,Python的整型并不是固定的32位。在实现上借鉴了网上的做法,把数对0x100000000取余,把数控制在32位,但是在返回上,如果结果小于0还是有问题,因为实际上计算是在64位上进行的,只是通过取余控制的变化范围,所以当第32位(标志位)为1时,返回值应该是负值,如果能把32到64位全置1即可正确输出,(~0x100000000+1)=(0xFFFFFFFF00000000),如果返回值跟它做或运算,就能按负数输出
先上个代码:
#encoding=utf-8
import numpy as np
class Solution(object):
def getSum(self, a, b):
"""
:type a: int
:type b: int
:rtype: int
"""
while b != 0:
c = a & b % 0x100000000
a = a ^ b % 0x100000000
b = (c << 1) % 0x100000000
if a <= 0x7FFFFFFF:
return a
else:
return a | (~0x100000000+1)