LeetCode 371.两整数之和

题目

给你两个整数 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版权协议,转载请附上原文出处链接和本声明。