我是python的新手,正在浏览以下代码,该代码接受一个整数,并以二进制值输出1的位置。
def L(encoded_set):
print('{', end = '')
i = 0
if encoded_set:
while encoded_set % 2 == 0:
encoded_set //= 2
i += 1
print(i, end = '')
encoded_set //= 2
i += 1
while encoded_set:
if encoded_set % 2:
print(',', i,end = '')
encoded_set //= 2
i += 1
print('}')
例如:54的二进制数是110110所以代码将输出:{1,2,4,5}
现在,我需要将此输出定向到一个集合,以便我可以使用单个集合元素。类似X [0] = 1,X [1] = 2,X [2] = 4 和X [3] = 5.我不知道该怎么做。
答案 0 :(得分:0)
作为一种更优雅的方式,您可以使用bin
功能将您的号码转换为binary
并使用enumerate
和列表理解来返回正确的位置,并返回索引列表:
>>> def pos(num) :
... return [i for i,j in enumerate(bin(num)[2:],1) if j=='1']
...
>>> pos(54)
[1, 2, 4, 5]
注意 bin
的结果导致数字前导0b
,因此您需要循环覆盖二进制数的切片(bin(num)[2:]
)。
答案 1 :(得分:0)
我会选择值移位
ones = []
pos = 0
while val:
if val & 1:
ones.append(pos)
pos += 1
val >>= 1
您的解决方案编号来自第一个非0最重要的位 - 除非MSB的位置已知(是的,您知道,但是您必须为此添加额外的代码),这可能毫无意义。我的解决方案计算相对于LSB的位置。