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)
Другие вопросы по тегам