不使用+或-运算符实现两数相加(Python):代码优化求助
优化无加减运算符的整数求和代码
你的原代码在处理负数时会出错,核心问题出在range()的使用上:
- 当参数为负数时,
range(min_val)会生成空列表(因为range默认从0开始,结束值小于起始值时不会生成任何元素),比如a=-1、b=1时,range(-1)是空的,合并后的列表长度是1,自然得不到预期的0。 - 这种依赖生成列表统计长度的方法,在数值较大时会占用大量内存,运行效率极低。
换用位运算是解决这类问题的标准方案,能支持所有整数(正、负、零),且效率极高,完全符合不使用+和-的要求:
def get_sum(a: int, b: int) -> int: # 用掩码模拟32位有符号整数,处理Python无限精度整数的溢出问题 mask = 0xFFFFFFFF while b != 0: # 异或计算无进位的和,与运算左移计算进位,用掩码限制位数 a, b = (a ^ b) & mask, ((a & b) << 1) & mask # 将32位有符号整数转换回Python的负整数格式 return a if a <= 0x7FFFFFFF else ~(a ^ mask) # 测试用例验证 print(get_sum(-1, 1)) # 输出0 print(get_sum(5, 5)) # 输出10 print(get_sum(10, 5)) # 输出15 print(get_sum(5, 10)) # 输出15
位运算逻辑说明
a ^ b:二进制位上不同为1、相同为0,刚好对应无进位加法的结果。(a & b) << 1:二进制位上都为1的位置会产生进位,左移一位就是进位的实际值。- 循环执行直到进位
b为0,此时a就是最终的和。 - 掩码
0xFFFFFFFF和最后的负数转换,是为了适配Python的无限精度整数,模拟常规32位有符号整数的运算规则。
内容的提问来源于stack exchange,提问作者quora question
相关产品推荐
相关产品推荐

