不使用运算符 + 和 - ,计算两整数 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(如果结果为正的话)。这种操作通常用于计算机中的一些特殊运算。