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。不知道为什么?
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。不知道为什么?
|
BuilderQiuJun 3, 2015
1
C++、Java会溢出
> Python的整型数据的位宽是32位,8个字节。int 最大值是2147483647 (sys.maxint),而long 长度仅受内存大小限制。 > 溢出的int整数操作结果升级为long类 传送门: http://www.cnblogs.com/zhengyun_ustc/archive/2009/10/14/shifting.html |
|
arbipherJun 3, 2015
2
看标题还以为是自然数的递归定义。。。
|
|
3
@BuilderQiu
是要将(n1&n2)强制类型转换为long吗?试过之后还是不可以。 |
|
oott123Jun 3, 2015 via Android
4
为啥要用 Python 做这种事情…
|
|
czheoJun 4, 2015
7
(n1&n2)<<1这一步int overflow的时候,python会自动转成long。解决方法如下。
http://stackoverflow.com/questions/7201207/python-bitshift-32-bit-constraint |
|
recall704Jun 4, 2015
8
@BuilderQiu 少年,32bit 不是 4字节么?咋变成8字节了
|
|
BuilderQiuJun 4, 2015
9
|