You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python无加减运算符整数求和:负数场景问题求助

嘿,这个问题我之前踩过坑!核心原因是Python的整数是无限精度的,不像C++这类语言有固定位数的二进制表示,所以处理负数时,进位会一直无限左移,导致循环要么停不下来,要么返回错误结果。咱们来一步步修复你的代码:

问题分析

你原来的代码只处理了正整数,因为正数的进位最终会左移到0。但负数在Python里用无限位的补码表示(比如-1的二进制是...11111111),当你计算进位并左移时,这个进位会一直存在,导致循环结束后得到错误的结果(比如-1 + 1会返回4而不是0)。

解决方案:模拟固定位补码运算

我们可以用一个掩码来限制整数的位数(比如32位),模拟常规编程语言的有符号整数行为,这样就能正确处理负数了。修改后的代码如下:

class Solution(object):
    def getSum(self, a, b):
        """
        :type a: int
        :type b: int
        :rtype: int
        """
        # 32位整数掩码,用来限制运算在32位范围内
        mask = 0xFFFFFFFF
        # 循环直到进位为0
        while b != 0:
            # 计算进位,并用掩码截断避免无限扩展
            carry = (a & b) << 1 & mask
            # 计算无进位和,同样用掩码截断
            a = (a ^ b) & mask
            b = carry
        # 如果结果是32位负数,转换为Python的负整数格式
        return a if a <= 0x7FFFFFFF else ~(a ^ mask)

代码解释

  • 掩码mask = 0xFFFFFFFF:这是32位全1的二进制数,确保所有运算都被限制在32位以内,避免Python无限扩展高位。
  • 循环处理进位:每次计算无进位和(a ^ b)和进位((a & b) << 1),并用掩码截断结果,模拟32位整数的行为。
  • 负数转换:32位有符号整数的最大值是0x7FFFFFFF(2^31-1),如果结果超过这个值,说明这是一个32位负数,我们需要把它转换成Python的负整数格式:~(a ^ mask),这一步会把32位的补码负数转换为Python的原生负整数。

测试用例验证

  • 输入a=1, b=2:返回3,正确。
  • 输入a=-1, b=1:返回0,正确。
  • 输入a=-5, b=-3:返回-8,正确。

如果需要支持64位整数,只需要把mask改成0xFFFFFFFFFFFFFFFF,最大值改成0x7FFFFFFFFFFFFFFF即可。

内容的提问来源于stack exchange,提问作者casillas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:49:53