我有许多节点可以分组以通过位掩码响应命令。例如: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
答案 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 所以这样做是将您的值与0b1,0b10,0b100等进行比较。
答案 1 :(得分:2)
使用位操作(和循环!):
>>> for i in range(16):
... if grp & (1<<i):
... print('Group', i+1)