So I am thinking of writing a bitboard in python or lisp. But I don't know how to ensure I would get a 64 bit integer in python. I have been reading documentation and found that mpz library returns a unsigned 32 bit integer. Is this true? If not what should I do?
-
What do you mean by "a bitboard"? How many bits do you really need? What's special about 64-bit integers that would help you solve your problem? What exactly are you trying to do?Karl Knechtel– Karl Knechtel2011-12-30 06:48:24 +00:00Commented Dec 30, 2011 at 6:48
-
2If you want to do bit-twiddling, Python is a very poor choice as the operations will not be compiled into a small number of CPU arithmetic instructions.user97370– user973702011-12-30 09:15:13 +00:00Commented Dec 30, 2011 at 9:15
2 Answers
Python 2 has two integer types: int, which is a signed integer whose size equals your machine's word size (but is always at least 32 bits), and long, which is unlimited in size.
Python 3 has only one integer type, which is called int but is equivalent to a Python 2 long.
5 Comments
long(x)You have a couple of options using gmpy. Here is one example using gmpy:
>>> from gmpy import mpz
>>> a=mpz(7)
>>> bin(a)
'0b111'
>>> a=a.setbit(48)
>>> bin(a)
'0b1000000000000000000000000000000000000000000000111'
>>>
gmpy2 is the development version of gmpy and includes a new type called xmpz that allows more direct access to the bits.
>>> from gmpy2 import xmpz
>>> a=xmpz(7)
>>> bin(a)
'0b111'
>>> a[48]=1
>>> bin(a)
'0b1000000000000000000000000000000000000000000000111'
>>>
There are other solutions such as bitarray you might want to look at.
Disclaimer: I maintain gmpy and gmpy2.
3 Comments
gmpy after a=a.setbit(48) the value of a changes to mpz(281474976710663) because of the first bit. I'm not sure why is this the case, is this the meant behaviour? If I manually change the beginning of the '0b0' instead of '0b1' (as it weas introduced by the conversion to 48 bits) it works fine. Is there a better way around it?