Python 实现不用加减乘除做加法,输入负数无结果。

2015-06-03 20:06:21 +08:00
 latteczy
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。不知道为什么?

5777 次点击
所在节点    Python
9 条回复
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
arbipher
2015-06-03 21:25:22 +08:00
看标题还以为是自然数的递归定义。。。
latteczy
2015-06-03 22:09:03 +08:00
@BuilderQiu
是要将(n1&n2)强制类型转换为long吗?试过之后还是不可以。
oott123
2015-06-03 22:28:38 +08:00
为啥要用 Python 做这种事情…
czheo
2015-06-03 22:30:50 +08:00
@oott123 why not?
xiazi
2015-06-04 00:27:24 +08:00
@oott123 可以让别人看不懂你的代码
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
recall704
2015-06-04 09:39:25 +08:00
@BuilderQiu 少年,32bit 不是 4字节么?咋变成8字节了
BuilderQiu
2015-06-04 11:10:41 +08:00
@recall704
按说32bit的话是4字节 4x8 ...
我那是直接引用的查询到的文章里面的。。。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/195894

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX