每日一道Leetcode -剑指 Offer 65. 不用加减乘除做加法 [python补码]

在这里插入图片描述
大佬题解:
在这里插入图片描述

class Solution:
    def add(self, a: int, b: int) -> int:
        """
        若补码 a 为负数( 0x7fffffff 是最大的正数的补码 ),需执行 ~(a ^ x) 操作,将补码还原至 Python 的存储格式。 a ^ x 运算将 1 至 32 位按位取反; ~ 运算是将整个数字取反;因此, ~(a ^ x) 是将 32 位以上的位取反,1 至 32 位不变。
        """
        x = 0xffffffff
        # 先将每个数字取反
        a,b = a & x, b & x
        # 当进位为0时跳出 a是非进位和(异或操作) b是进位(与操作+移位操作)
        while b!=0:
            a,b = (a^b),(a & b)<<1 & x
        return a if a<=0x7fffffff else ~(a^x)

        
        """
        Java写法:

        while(b != 0) { // 当进位为 0 时跳出
            int c = (a & b) << 1;  // c = 进位
            a ^= b; // a = 非进位和
            b = c; // b = 进位
        }
        return a;

        """

版权声明:本文为weixin_41041275原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。