我正在尝试使用+符号添加两个整数。我认为没有进位的和可以计算为a ^ b,并且进位可以被计算为(a& b)<< 1。 0x7FFFFFFF是32位整数的最大数,但是掩码是做什么的?为什么进位和a必须在每次迭代中使用MASK进行修改?当结果大于MAX_INT时,〜((a& MAX_INT)^ MAX_INT)会做什么?
def get_sum(a,b):
MAX_INT = 0x7FFFFFFF
MASK = 0x100000000
while b:
carry = ((a&b) << 1 ) % MASK
a = (a^b) % MASK
b = carry
if a <= MAX_INT:
return a
else:
return ~((a & MAX_INT) ^ MAX_INT)
答案 0 :(得分:0)
让我们考虑二进制a = 13
中的1101
和二进制b = 5
中的101
。
特别是我们一步一步地看看While
块中发生了什么,按操作进行操作,但是现在让我们忽略% MASK
操作。
carry= a= b=
a b a&b <<1 a^b carry
1101 101 101 1010 1000 1010
1000 1010 1000 10000 0010 10000
0010 10000 0 0 10010 0
10010 0 -> exit loop
a是二进制10010
=十进制18
,因此小于MAX_INT
,因此 18将作为(正确)结果返回。
掩码操作的目的是确保不会发生MSB溢出,这在数字变大时是可能的。
你认为你能用上面所示的相同方法找出Else
部分吗?