Как я могу ограничить число бит в целочисленной переменной в Python? - PullRequest
4 голосов
/ 16 ноября 2010

Я хочу реализовать алгоритм IDEA в Python. В Python у нас нет ограничений на размер переменной, но мне нужно ограничить число бит в целом числе, например, для циклического сдвига влево. Что вы посоветуете?

Ответы [ 4 ]

3 голосов
/ 16 ноября 2010

Одним из способов является использование библиотеки BitVector .

Пример использования:

>>> from BitVector import BitVector
>>> bv = BitVector(intVal = 0x13A5, size = 32)
>>> print bv
00000000000000000001001110100101
>>> bv << 6                            #does a cyclic left shift
>>> print bv
00000000000001001110100101000000
>>> bv[0] = 1
>>> print bv
10000000000001001110100101000000
>>> bv << 3                            #cyclic shift again, should be more apparent
>>> print bv
00000000001001110100101000000100
2 голосов
/ 16 ноября 2010

Модуль bitstring может помочь (документация здесь ).В этом примере создается 22-битная цепочка битов и вращается биты 3 вправо:

>>> from bitstring import BitArray
>>> a = BitArray(22)   # creates 22-bit zeroed bitstring
>>> a.uint = 12345     # set the bits with an unsigned integer 
>>> a.bin              # view the binary representation
'0b0000000011000000111001'
>>> a.ror(3)           # rotate to the right
>>> a.bin
'0b0010000000011000000111'
>>> a.uint             # and back to the integer representation
525831
2 голосов
/ 16 ноября 2010

8-битная маска с циклическим левым сдвигом:

shifted = number << 1
overflowed = (number & 0x100) >> 8
shifted &= 0xFF
result = overflowed | shifted

Вы должны быть в состоянии создать класс, который сделает это за вас. С чуть большим количеством того же самого, это может сдвинуть произвольную величину из значения произвольного размера.

1 голос
/ 16 ноября 2010

Если вам нужны младшие 32 бита числа, вы можете использовать двоичный код, например:

 >>> low32 = (1 << 32) - 1
 >>> n = 0x12345678
 >>> m = ((n << 20) | (n >> 12)) & low32
 >>> "0x%x" % m
 '0x67812345'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...