Python найти 1 в битовой маске
У меня есть несколько узлов, которые можно сгруппировать для ответа на команды через битовую маску. Например: NodeA находится в группах 1 и 5. На вопрос, к каким группам он принадлежит, он отвечает 17, из которых двоичный эквивалент равен "0b10001". Узел в группах 2, 7 и 9 сказал бы, что он принадлежит группе 322 ('0b101000010'). Мне нужен способ показать пользователю, к какой группе принадлежит указанный узел. Есть возможность 16 групп. Мой код выдаст мне ошибку "строковый индекс вне диапазона", если двоичный файл не содержит 16 символов. Я знаю, что есть лучший способ:
def xref(grp):
a = bin(grp)
d = str(a)
if d[-1] == '1':
print "Group 1"
if d[-2] == '1':
print "Group 2"
if d[-3] == '1':
print "Group 3"
repeat for 16 groups
2 ответа
Вам просто нужно использовать некоторые основные побитовые операторы.
Вот пример:
def findbits(num):
for i in range(16):
if num & 1 << i:
print("Group {0}".format(i + 1))
И результаты:
>>> findbits (0b10001) Группа 1 Группа 5 >>> findbits(0b10100010) Группа 2 Группа 6 Группа 8 >>> findbits(0b101000010) Группа 2 Группа 7 Группа 9
То, что это делает, это перебирает 16 бит, которые вы хотите посмотреть.
1 << i
сдвигает число 1 наi
биты, например1 << 4
будет 0b10000- num & независимо от того, что делает побитовое И - каждый бит числа устанавливается в 1, если биты двух операндов равны 1.
Итак, что это делает, сравнивает ваши значения с 0b1, 0b10, 0b100 и т. Д.
Используйте битовые операции (и циклы!):
>>> for i in range(16):
... if grp & (1<<i):
... print('Group', i+1)