Побитовые операции в Python - PullRequest
4 голосов
/ 13 мая 2011

Я ищу рекомендации о том, как сделать побитовую математику в Python.

Основная проблема, с которой я столкнулся, заключается в том, что побитовые операторы python имеют бесконечную точность, что означает, что -1 действительно равно «111 ....... 111». Это не то, что я хочу. Я хочу эмулировать реальное оборудование, которое будет иметь некоторую фиксированную точность, скажем, 32 бита.

Вот некоторые ошибки:

1) -n должен возвращать 32-битный номер дополнения 2 (это легко сделать, взяв младшие 32 бита бесконечной точности -n)

2) n >> 3, должно быть арифметическим сдвигом 32-битного числа, что означает, что если бит 31 равен «1», то биты 31:28 должны быть «1» после сдвига на 3.

Ответы [ 2 ]

6 голосов
/ 13 мая 2011

Вы можете использовать numpy, он имеет встроенные типы int32 и многое другое.

3 голосов
/ 13 мая 2011

Вы всегда можете добавить маску & ((1<<32) - 1), чтобы ограничить число 32-битами, прежде чем выполнять какую-либо операцию, например,

class Int32(int):
    def __neg__(self):
        return Int32(int.__neg__(self) & ((1 << 32) - 1))
    def __rshift__(self, other):
        if self & (-1 << 31):
             retval = int.__rshift__(int.__sub__(self, 1<<32), other)
             return Int32(retval & ((1 << 32) - 1))
        else:
             return Int32(int.__rshift__(self, other))
    ...

>>> -Int32(5)
4294967291
>>> (-Int32(5)) >> 1
4294967293
...