返回活动位列表

-3 投票
4 回答
821 浏览
提问于 2025-04-18 10:29

我该如何获取所有活动位的列表(当位的值为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)]

撰写回答