python计算两数之和_python中不使用“+”运算符的两个整数之和

让我们暂时忽略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位,那么实现是正确的。在

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值