python在一个位掩码中找到1#s

时间:2016-08-16 16:07:52

标签: python bitmask

我有许多节点可以分组以通过位掩码响应命令。例如: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 个答案:

答案 0 :(得分:4)

您只需要使用一些基本的bitwise operators

以下是一个例子:

def findbits(num):
  for i in range(16):
    if num & 1 << i:
      print("Group {0}".format(i + 1))

结果:

>>> findbits(0b10001) 
Group 1
Group 5

>>> findbits(0b10100010)
Group 2
Group 6
Group 8

>>> findbits(0b101000010)
Group 2 
Group 7 
Group 9

这样做会循环遍历您要查看的16位。

  • 1 << i将数字1移位i位,例如1 << 4将为0b10000
  • num&amp;任何按位AND - 如果两个操作数的位为1,则该数字的每个位都设置为1.

所以这样做是将您的值与0b1,0b10,0b100等进行比较。

答案 1 :(得分:2)

使用位操作(和循环!):

>>> for i in range(16):
...  if grp & (1<<i):
...   print('Group', i+1)