使用位操作理解 python 中的二进制加法

问题描述 投票:0回答:0

我已经苦苦挣扎了 4 个小时,试图理解为什么我们在评估 ~(a ^ mask)a 超过 32 位数字最大值 0x7fffffff 时做 a + b

我明白为什么我们要掩盖每一个 (a & b) << 1a ^ b。我们这样做是因为在 Python 中,负数的 2s 补码需要无限位。因此我们将迭代无限次。我也明白 (a & b) << 1 在做加法时处理向前移动进位 1 位。我明白 a ^ b 处理总和而不带进位。

我不明白的是,为什么我们在返回答案时需要再次屏蔽 a?为什么用 ^ (XOR) 和 & (AND) 掩码?

退出循环时它已经被屏蔽了:a = (a ^ b) & mask。那么,如果 ~a 设置为 32nd bit for 1,为什么我们不能只做 a 呢?

我认为的一个解释是,如果 a 是负数(当我们退出循环时),那么它的二进制补码中将有无限个 1,我们需要将其屏蔽。但是当我打印 a 时,它是一个有限 1 的正数。我想这是预料之中的,因为我们 掩盖它。

看了Python中Bit-wise NOT的含义,理解~操作,但是没看懂

我的代码:

def getSum(self, a: int, b: int) -> int:
    
    # 32bit mask
    mask = 0xFFFFFFFF # 8Fs = all 1s for 32 bits

    while True: 
        a, b = (a ^ b) & mask, ((a & b) << 1) & mask
        if b == 0:
            break

    # return a
    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)

a = -12, b = -8 输出:

A: 4294967276
Bin A: 0b11111111111111111111111111101100
Bin M: 0b11111111111111111111111111111111
  A^M: 0b10011
~ A^M: -0b10100
  ~ A: -0b11111111111111111111111111101101
python bit-manipulation 32bit-64bit
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.