def Add(n1,n2):
carry=1
while carry!=0:
s = n1^n2
carry = (n1&n2)<<1
n1 = s
n2 = carry
return n1
按照这个思路用c++和java写都没有问题,但是用Python时输入负数就不行。问题应该出在carry这个地方,我打印了一下一直递增,不会出现0。不知道为什么?
1
BuilderQiu 2015-06-03 21:22:31 +08:00
C++、Java会溢出
> Python的整型数据的位宽是32位,8个字节。int 最大值是2147483647 (sys.maxint),而long 长度仅受内存大小限制。 > 溢出的int整数操作结果升级为long类 传送门: http://www.cnblogs.com/zhengyun_ustc/archive/2009/10/14/shifting.html |
2
arbipher 2015-06-03 21:25:22 +08:00
看标题还以为是自然数的递归定义。。。
|
3
latteczy OP @BuilderQiu
是要将(n1&n2)强制类型转换为long吗?试过之后还是不可以。 |
4
oott123 2015-06-03 22:28:38 +08:00 via Android
为啥要用 Python 做这种事情…
|
7
czheo 2015-06-04 00:59:47 +08:00
(n1&n2)<<1这一步int overflow的时候,python会自动转成long。解决方法如下。
http://stackoverflow.com/questions/7201207/python-bitshift-32-bit-constraint |
8
recall704 2015-06-04 09:39:25 +08:00
@BuilderQiu 少年,32bit 不是 4字节么?咋变成8字节了
|
9
BuilderQiu 2015-06-04 11:10:41 +08:00
|