2017-05-31 109 views
1

我试图用+符号添加两个整数。我得到的想法是,无进位总和可以计算为a^b,并且进位可以计算为(a & b)< < 1. 0x7FFFFFFF是32位整数的最大值,但是掩码是做什么的?为什么carry和a必须在每次迭代中使用MASK进行修改?当结果大于MAX_INT时,〜((a & MAX_INT)^ MAX_INT)是做什么的?用位操作添加2个整数

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

让我们考虑a = 13,二进制1101b = 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 

一个是二进制10010 =十进制18并因此比MAX_INT少,所以18被返回作为(正确的)导致

掩码操作的目的是为了确保不会发生MSB溢出,当数字变大时可能会发生溢出。

您是否认为您可以通过上述相同的方法计算出Else部件?