I am looking at solutions for this question:
Given two integers
a
andb
, return the sum of the two integers without using the operators+
and-
. (Input Limits:-1000
<= a, b <=1000
)
In all these solutions, I am struggling to understand why the solutions do ~(a ^ mask)
when a
exceeds 32-bit number max 0x7fffffff
when evaluating a + b
[see code below].
def getSum(self, a: int, b: int) -> int:
# 32bit mask
mask = 0xFFFFFFFF # 8Fs = all 1s for 32 bits
while True:
# Handle addition and carry
a, b = (a ^ b) & mask, ((a & b) << 1) & mask
if b == 0:
break
max_int = 0x7FFFFFFF
print("A:", a)
print("Bin A:", bin(a))
print("Bin M:", bin(mask))
print(" A^M:", bin(a ^ mask))
print("~ A^M:", bin(~(a ^ mask)))
print(" ~ A:", bin(~a))
return a if a < max_int else ~(a ^ mask)
I don't get why we need to mask a
again when returning answer?
When exiting the loop it was already masked: a = (a ^ b) & mask
. So why can't we just do ~a
if the 32nd bit
is set to 1
for a
?
I looked at The meaning of Bit-wise NOT in Python, to understand ~ operation, but did not get it.
Output for a = -12
, b = -8
. Correctly returns -20
:
A: 4294967276
Bin A: 0b11111111111111111111111111101100
Bin M: 0b11111111111111111111111111111111
A^M: 0b10011
~ A^M: -0b10100
~ A: -0b11111111111111111111111111101101