在Python中获取64位整数

12

所以我考虑用Python或Lisp编写位板(bitboard)。但是我不知道如何确保在Python中获得64位整数。我一直在阅读文档,并发现mpz库返回一个无符号的32位整数。这是否属实?如果不是,那我应该怎么做?


“位棋盘”是什么意思?你真正需要多少位?64位整数有什么特殊之处可以帮助你解决问题?你到底想做什么? - Karl Knechtel
2
如果你想进行位操作,Python 是一个非常糟糕的选择,因为这些操作不会被编译成少量的 CPU 算术指令。 - user97370
2个回答

35

Python 2有两种整数类型: int,这是一种带符号的整数,其大小等于您机器的字长(但至少为32位),以及long,它的大小不受限制。

Python 3只有一种整数类型,称为int,但它相当于Python 2中的long


这个回答解决了你的问题吗? - Taymon
2
基本上我需要64位来表示一个棋盘。我一直在阅读一些程序的源代码,它们使用mpz。但不幸的是,它的文档并不是很好。如果我想在64位中存储一个整数,我该怎么做?你能给个例子吗? - Mark
@Mark 你正在查看一些相当过时的代码。来自PEP 4:mpz模块自Python 2.2以来已被记录为过时。在Python 2.4中从库参考中删除。 - Janne Karila
@JanneKarila:我认为MPZ已经在一个叫做gmpy的模块中重新实现了。大多数我正在阅读的程序似乎都包括了来自gmpy的mpz。 - Mark
@Mark 好的,那么请参阅gmpy文档:通过将mpz对象作为调用Python内置数字类型(int、long、float、complex)参数之一来将其转换为Python数字。例如,使用long(x) - Janne Karila

3

使用gmpy有几种选项。下面是一个使用gmpy的例子:

>>> from gmpy import mpz
>>> a=mpz(7)
>>> bin(a)
'0b111'
>>> a=a.setbit(48)
>>> bin(a)
'0b1000000000000000000000000000000000000000000000111'
>>> 

gmpy2是gmpy的开发版本,包括一个名为xmpz的新类型,允许更直接地访问位。

>>> from gmpy2 import xmpz
>>> a=xmpz(7)
>>> bin(a)
'0b111'
>>> a[48]=1
>>> bin(a)
'0b1000000000000000000000000000000000000000000000111'
>>> 

还有其他解决方案,例如bitarray,您可能需要查看。

免责声明:我维护gmpy和gmpy2。


比特数组是否和mpz一样快? - Mark
我还没有与bitarray进行性能比较。在上面的示例中,xmpz位访问大约比mpz快两倍。 - casevh
使用gmpy后,当a=a.setbit(48)时,由于第一位的原因,a的值会更改为mpz(281474976710663)。我不确定这是否是预期行为?如果我手动更改'0b1'的开头而不是'0b0'(因为它被转换为48位),那么它就可以正常工作。有没有更好的解决方法? - w4nderlust

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接