使用位操作添加2个整数

时间:2017-05-31 00:20:34

标签: integer bit-manipulation integer-overflow

我正在尝试使用+符号添加两个整数。我认为没有进位的和可以计算为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)

1 个答案:

答案 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部分吗?