Как написать битовую маску в python для чистых битов между индексами j и i? - PullRequest
0 голосов
/ 15 февраля 2019

Я хочу получить битовую маску для очистки строки между индексом j и i.

В Java я знаю что-то вроде

int allOnes = ~0;
int left = allOnes << (j + 1);
int right = ((i<<j) - 1);
int mask = left | right;

Как реализовать это в Python?

Ответы [ 3 ]

0 голосов
/ 15 февраля 2019

Тот же код, просто удалите int, и он будет работать

allOnes = ~0;
left = allOnes << (j + 1);
right = ((i<<j) - 1);
mask = left | right;
0 голосов
/ 15 февраля 2019

Я рекомендую преобразовать в строку и нарезать вместо маскировки ... по моему опыту, это часто быстрее

x = 5233513423
print(int(bin(x)[2:][3:7],2))

, хотя это просто даст вам интересующие вас биты

(т.е. если вы действительно хотите, чтобы результат был 0b11011000 (или что-то еще) вместо просто 0b11011, вам нужно будет вручную сдвинуть некоторые биты)

0 голосов
/ 15 февраля 2019

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

>>> i = 8
>>> j = 12
>>> mask = sum(2**x for x in range(i-1, j-1))
>>> bin(mask)
'0b11110000000'

И затем вы можете использовать это, чтобы замаскировать действительные числа:

>>> num = 0b110100111100001101100110101
                            ^^^^
>>> bin(num & mask)
'0b1100000000'
   ^^^

Начальный 0, конечно, опущен

...