Выполнение произвольно больших битовых вращений над целым числом - PullRequest
0 голосов
/ 02 декабря 2018

Я пытаюсь выполнить очень большие битовые вращения на неотрицательных 16-битных целых числах в Python, однако это очень медленно.Я попытался оптимизировать процесс, сдвинув его по модулю 16, но в конце он оставляет кучу нулей.Есть ли способ это исправить?Можем ли мы обрезать двоичный файл до 16-битного окна?Существуют ли другие методы для повышения производительности?Я не могу использовать внешние библиотеки.

Пример операции: 23748 >> 8857328954.

Вот пример кода, который я пробовал:

x = 35233
y = 738337234 % 16
x >> y

1 Ответ

0 голосов
/ 03 декабря 2018

Оператор >> не является циклическим сдвигом - он полностью отбрасывает значения, сдвинутые за пределы младшего бита, вместо перехода к MSB:

>>> bin(51)[2:].zfill(6)
'110011'
>>> bin(51 >> 3)[2:].zfill(6)
'000110'

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

def cshift_right(num, dist):
     v1 = num >> (dist % 16)                  # this is your original logic
     v2 = (num << (16 - dist % 16)) & 0xFFFF  # shift left, and mask off higher bits
     return v1 | v2                           # combine the two results

Проверка того, что это работает:

>>> bin(51)[2:].zfill(16)
'0000000000110011'
>>> bin(cshift_left(51, 3))[2:].zfill(16)
'0110000000000110'
...