gpt4 book ai didi

python - 整数到位域作为列表

转载 作者:太空狗 更新时间:2023-10-29 16:59:08 25 4
gpt4 key购买 nike

我创建了一个将 int 转换为位域(在列表中)的方法并且它有效,但我确信有更优雅的解决方案 - 我一直在盯着很长时间了。

我很好奇,如何将 int 转换为 list 中表示的位域?

def get(self):
results = []

results.append(1 if (self.bits & 1) else 0)
results.append(1 if (self.bits & 2) else 0)
results.append(1 if (self.bits & 4) else 0)
results.append(1 if (self.bits & 8) else 0)
results.append(1 if (self.bits & 16) else 0)
results.append(1 if (self.bits & 32) else 0)
results.append(1 if (self.bits & 64) else 0)
results.append(1 if (self.bits & 128) else 0)

return results

def set(self, pin, direction):
pin -= 1
if pin not in range(0, 8): raise ValueError

if direction: self.bits |= (2 ** pin)
else: self.bits &=~(2 ** pin)

最佳答案

这个怎么样:

def bitfield(n):
return [int(digit) for digit in bin(n)[2:]] # [2:] to chop off the "0b" part

这给了你

>>> bitfield(123)
[1, 1, 1, 1, 0, 1, 1]
>>> bitfield(255)
[1, 1, 1, 1, 1, 1, 1, 1]
>>> bitfield(1234567)
[1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 1, 1]

不过这只适用于正整数。

编辑:

使用 int() 转换为 int 在这里有点矫枉过正。这要快得多:

def bitfield(n):
return [1 if digit=='1' else 0 for digit in bin(n)[2:]]

查看时间:

>>> import timeit
>>> timeit.timeit("[int(digit) for digit in bin(123)[2:]]")
7.895014818543946
>>> timeit.timeit("[123 >> i & 1 for i in range(7,-1,-1)]")
2.966295244250407
>>> timeit.timeit("[1 if digit=='1' else 0 for digit in bin(123)[2:]]")
1.7918431924733795

关于python - 整数到位域作为列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10321978/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com