题目
给你两个整数 a 和 b ,不使用 运算符 + 和 - ,计算并返回两整数之和。
示例 1:
输入:a = 1, b = 2
输出:3
示例 2:
输入:a = 2, b = 3
输出:5
我的蒟蒻想法
按位去模拟 异或确定没有进位的值,当结果是0时 去判断是不是都是1,是1就有进位 放到更高位去判断,然后再看上一次的进位标志是否有1.。。。。。就这样下去,感觉太憨了
大佬的想法
异或运算确定没有进位的数值 x,与运算确定那些位产生进位,然后左移一位 y ,然后x 和y 继续重复运算 直到有一个为0

因为还有负数,所以使用补码去运算
原理挺简单,主要是python有点点需要注意的地方(无限长整数类型)
class Solution:
def getSum(self, a: int, b: int) -> int:
a &= 0xFFFFFFFF
b &= 0xFFFFFFFF
while b:
carry = a&b
a = a^b
b = (carry << 1) & 0xFFFFFFFF
return a if a < 0x80000000 else ~(a^0xFFFFFFFF)
a &= 0xFFFFFFFF
b &= 0xFFFFFFFF
模拟32位有符号整数,0xFFFFFFFF为低32位全1,其余高位全为0
相与之后,可以保存a,b的低32位
进行运算
a if a < 0x80000000 else ~(a^0xFFFFFFFF)
得到结果后,判断是否为负数,负数的话要还原为无限长整数类型,也就是要将高于32位的地方全取反,低于等于32位的地方保持不变
做法就是 先将低32位全取反一次 ,再整个取反,低32位取反两次 所以不变
a^0xFFFFFFFF就是将低32位取反
(用4位来演示一下)
版权声明:本文为weixin_43667972原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。