让我们暂时忽略MASK、MAX_INT和{}。在
为什么这个黑魔法按位的东西有用?
计算之所以有效是因为(a ^ b)是对a和{}的位进行“求和”。回想一下,位异或是1,当位相同时是0。例如(其中D为十进制,B为二进制),20D==10100B,9D=1001B:10100
1001
-
11101
11101B==29D
但是,如果你有一个手提箱,它就不能很好地工作。例如,考虑添加(按位异或)20D和20D
^{pr2}$
哦。20+20当然不等于0。输入(a & b) << 1项。这个术语代表每个位置的“进位”。在while循环的下一次迭代中,我们添加上一个循环的进位。所以,如果我们用之前的例子,我们得到:# First iteration (a is 20, b is 20)
10100 ^ 10100 == 00000 # makes a 0
(10100 & 10100) << 1 == 101000 # makes b 40
# Second iteration:
000000 ^ 101000 == 101000 # Makes a 40
(000000 & 101000) << 1 == 0000000 # Makes b 0
现在b为0,我们完成了,所以返回a。这种算法一般来说是有效的,而不仅仅是针对我所概述的特定情况。正确性的证明留给读者作为练习;)
面具是做什么的?
所有掩码所做的就是确保该值是一个整数,因为您的代码甚至有声明a,b的注释,并且返回类型是int类型。因此,由于最大可能的int(32位)是2147483647。因此,如果您向该值添加2,就像您在示例中所做的那样,int溢出,您将得到一个负值。你必须在Python中强制这个,因为它不尊重其他的强类型语言如java和C++定义的这个^ {CD14}}边界。考虑以下因素:def get_sum(a, b):
while b:
a, b = (a ^ b), (a & b) << 1
return a
这是没有掩码的getSum版本。在print get_sum(2147483647, 2)
输出2147483649
同时print Solution().getSum(2147483647, 2)
输出-2147483647
由于溢流。在
故事的寓意是,如果您将int类型定义为仅表示32位,那么实现是正确的。在