返回活动位列表
我该如何获取所有活动位的列表(当位的值为1时就是活动位)?
举个例子:数字 220
在十进制中是 11011100
在二进制中,所以它应该返回 ['2', '3', '4', '6', '7']
,因为位0、1和5是关闭的。
4 个回答
1
这是一个比较简洁的代码写法:
print [i for (i,b) in (enumerate(reversed("{0:b}".format(220)))) if int(b)]
# [2, 3, 4, 6, 7]
1
这里有一个稍微不同的实现方式,使用了 itertools.compress() 这个工具。
x=list(map(int,bin(220)[2:]))
print list(compress(range(len(x)-1,-1,-1), x))
#output [7, 6, 4, 3, 2]
2
[2:]
是用来去掉二进制前缀的,[::-1]
是用来把结果反转过来的。
In [5]: [x for x, y in enumerate(bin(220)[2:][::-1]) if y != '0']
Out[5]: [2, 3, 4, 6, 7]
另外,你也可以使用 [-1:1:-1]
,这是 @jonrsharpe 提出的建议:
In [6]: [x for x, y in enumerate(bin(220)[-1:1:-1]) if y != '0']
Out[6]: [2, 3, 4, 6, 7]
2
这里有一个简单的替代方案,可以用一行代码实现(没有任何附加条件):
input_number = 220
print [i for i in xrange(input_number.bit_length()) if ((1 << i) & input_number)]