(python3)Leetcode -371 两整数之和

不使用运算符 + 和 - ,计算两整数 a 、b 之和。
示例 1:
输入: a = 1, b = 2;输出: 3
示例 2:输入: a = -2, b = 3;输出: 1

class Solution:
    def getSum(self, a: int, b: int) -> int:
        x = 0xffffffff
        a, b = a & x, b & x
        # 循环,当进位为 0 时跳出
        while b != 0:
            # a, b = 非进位和, 进位
            a, b = (a ^ b), (a & b) << 1 & x
        return a if a <= 0x7fffffff else ~(a ^ x)

这是一个位操作的问题,这个代码块主要是在进行无进位的异或操作,然后通过与一个掩码进行位与操作来得到最终的结果。
首先,步骤分解:

x = 0xffffffff:这是定义了一个32位的掩码,其中所有位都是1。

a, b = a & x, b & x:这一步将a和b分别与x进行位与操作,这样可以将a和b的最高位设置为0(如果a和b的最高位是1的话)。

循环部分:while b != 0:,这个循环会一直执行,直到b的所有位都为0

a, b = (a ^ b), (a & b) << 1 & x:在每一次循环中,先将a和b进行异或操作,然后将进位(即a & b的结果)左移一位并与掩码x进行位与操作。这样,新的进位就被设置为0了。

这是一个涉及到位运算和变量重新分配的表达式。让我们逐步拆解它。
首先,我们有两个操作数:a 和 b,以及一个变量 x。

1.第一步:计算 a ^ b

这个操作使用了异或(XOR)位运算符(^)。异或运算的规则是:当两个位不同时返回1,相同时返回0。因此,a ^ b 将返回一个新的值,其中每一位都是 a 和 b 中对应位的异或结果。

2. 第二步:计算 (a & b) << 1
这个操作分为两个部分:
* a & b:这是按位与(AND)运算,它将返回一个新的值,其中只有那些 a 和 b 中对应位都为1的位才为1。

* (a & b) << 1:这是左移位运算,将结果的所有位向左移动一位。在这个操作之后,(a & b) << 1 的所有位都比 a & b 多了一位。
3.第三步:计算 (a & b) << 1 & x

这个操作使用了按位与(AND)运算符(&)和左移位运算符(<<)。它首先计算 (a & b) << 1,然后使用按位与运算符(&)将这个结果与 x 进行按位与运算。这将返回一个新的值,其中只有那些 (a & b) << 1 和 x 中对应位都为1的位才为1。

4. 第四步:将计算结果赋值给 a 和 b。这样,a 和 b 的值就被重新分配了。
总结起来,这个表达式的功能是:

首先计算 a 和 b 的异或结果,然后将 a 和 b 与 x 进行按位与运算的结果左移一位后进行按位与运算,并将结果分别赋值给 a 和 b。这样的操作可能用于某些特定的算法或数据操作中。

返回部分:最后,如果a的所有位都是0(即小于等于0x7fffffff),那么直接返回a;

否则,返回~(a ^ x),这是因为如果a的所有位都不是0,那么就将其所有的1变为0,并取反。

总的来说,这段代码主要是在执行无进位的异或操作,并将结果中的所有1变为0(如果结果为正的话)。这种操作通常用于计算机中的一些特殊运算。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值