2017-05-31 105 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部件?