将位域整数作为列表

tMC*_*tMC 15 python list bit-fields

我已经创建了一个将一个方法转换int为一个位域(在一个列表中)并且它可以工作,但我确信有更优雅的解决方案 - 我只是一直盯着它看.

我好奇,你怎么把a转换成一个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)
Run Code Online (Sandbox Code Playgroud)

Tim*_*ker 29

这个怎么样:

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

这给了你

>>> 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]
Run Code Online (Sandbox Code Playgroud)

但这仅适用于正整数.

编辑:

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

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

看时间:

>>> 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
Run Code Online (Sandbox Code Playgroud)


geo*_*org 21

这不使用bin:

 b = [n >> i & 1 for i in range(7,-1,-1)]
Run Code Online (Sandbox Code Playgroud)

这是如何以这种方式处理任何整数:

 b = [n >> i & 1 for i in range(n.bit_length() - 1,-1,-1)]
Run Code Online (Sandbox Code Playgroud)

bit_length.

如果希望列表的索引0对应于int的lsb,请更改范围顺序,即

b = [n >> i & 1 for i in range(0, n.bit_length()-1)]
Run Code Online (Sandbox Code Playgroud)

另请注意,如果您尝试表示固定长度的二进制值,则使用n.bit_length()可能会成为失败点.它返回表示n的最小位数.

  • 当然这只处理8位整数. (3认同)