Python3 логическое смещение влево - PullRequest
0 голосов
/ 10 апреля 2020

По умолчанию операция 'сдвиг влево' в Python (<<) действует как арифметическое c сдвиг и добавляет 0 бит к концу битов, представляющих int. </p>

Например, : 100 << 1 возвращает 200 </p>

В двоичном представлении мы видим, что 100 = 0b1100100 (7 бит) и 100 << 1 = 0b11001000 (8 бит) </p>

In Python 3 Каков наилучший способ выполнения логического сдвига влево, когда число битов остается постоянным, а значения сдвигаются влево?

Например: 100 << 1 вернет 72 </p>

В двоичном представлении 100 = 0b1100100 и 100 << 1 = 0b1001000 Мы сохранили те же 7 битов, но просто сместили влево и добавили 0 в конец. </p>

1 Ответ

2 голосов
/ 10 апреля 2020

Вы можете использовать int.bitlength, чтобы получить число битов, необходимое для представления числа, затем and результат сдвига с (1 << bitlength) - 1, чтобы ограничить результат таким количеством битов:

def lls_const_bits(n):
    return (n << 1) & ((1 << n.bit_length()) - 1)

print(lls_const_bits(100))

Вывод:

72

Если вы хотите ограничить вывод фиксированным числом битов b, вам необходимо замаскировать (1 << b) - 1:

def lls_const_bits(n, b):
    return (n << 1) & ((1 << b) - 1)

print(lls_const_bits(100, 7))

Выход:

72
...