Calculate the sum of two integers a and b, but you are not allowed to use the operator + and -.
Example:
Given a = 1 and b = 2, return 3.
写一个渣版本
首先判断结果的符号(+,-)
分别有以下几种:
-9,7 结果<0
-9,-9 结果<0
7,9 结果>0
9,-7 结果>0
这里的符号判断用signfunc() and calsign()来实现,返回结果符号和取绝对值的a,b
同号相加的方式(9+7)
这里用到了一个半加法的思想, 即两位单独的位相加其结果可以用异或(^)得到, 进位可以用与(&)得到. 然后对于两个数字来说同样可以延伸这个思想.
异号相加的方式(-9+7)
异号相加实际上是两数相减,研究发现(9^7)=14
1001
0111
——
1110
(-14)取反是13
1…1110
————
0…1101
对有意义的位再取反即得到结果
0…1101
————
0….0010
class Solution(object):
def signfunc(self,a):
if a>0:
return 1,a
elif a<0:
return 2,-a
else:
return 0,0
def calsign(self, a, b):
flagmatrix=[[0,1,-1],[1,1,0],[-1,0,-1]]
flaga,a1=self.signfunc(a)
flagb,b1=self.signfunc(b)
if a1>b1:
flagmatrix[2][1]=-1
flagmatrix[1][2]=1
else:
flagmatrix[2][1]=1
flagmatrix[1][2]=-1
return flagmatrix[flaga][flagb],a1,b1
def getSum(self, a, b):
"""
:type a: int
:type b: int
:rtype: int
"""
if a*b>=0:
flag,a,b=self.calsign(a,b)
while(b):
carry=a&b
a=a^b
b=carry<<1
return flag*a
else:
tmp=~(-(abs(a)^abs(b)))
flag,a,b=self.calsign(a,b)
if a==b:
return 0
ans=[]
while(tmp):
ans.append('%s'%((tmp%2)^1))
tmp=tmp/2
ans.reverse()
return flag*int(''.join(ans),2)