将二进制转换为数字列表Python

时间:2012-10-26 05:13:52

标签: python list binary

我有以下情况:

x = 0b0111

我想将此值转换为:

y = [0, 1, 1, 1]

当我转换x = 0b1001时,我可以获得y = [1, 0, 0, 1],但当我尝试对x = 0b0111执行相同操作,然后使用str(bin(y))转换回来时 - 我似乎失去领先的0,并获得0b111

有什么建议吗?

10 个答案:

答案 0 :(得分:7)

一旦你得到那个字符串0b111,就可以直接分割出你感兴趣的数字。对于字符串中0b之后的所有字符,将其转换为整数。

[int(d) for d in str(bin(x))[2:]]

答案 1 :(得分:4)

对于它的价值,纯粹的算术解决方案似乎稍微快一点:

import timeit

def bits1(n):
    b = []
    while n:
        b = [n & 1] + b
        n >>= 1
    return b or [0]

timeit.timeit(lambda: bits1(12345678))
[out] 7.717339038848877

def bits2(n):
    return map(int, list(bin(n)[2:]))

timeit.timeit(lambda: bits2(12345678))
[out] 10.297518014907837

答案 2 :(得分:3)

首先将数字转换为二进制,然后转换为字符串:

str(bin(7))
'0b111' #note the 0b in front of the binary number

接下来,从字符串中删除0b

str(bin(7))[2:]
'111'

最后,我们使用list comprehension从字符串中创建一个int列表,其中大致以下形式:

[expr for i in iterable]
[int(i) for i in str(bin(x))[2:]]

答案 3 :(得分:1)

map(int, list(bin((1<<8)+x))[-4:])这样的表达式会给出一个数字的低4位作为列表。 (编辑:更简洁的表单是 map(int,bin(x)[2:].zfill(4)) ;请参阅下面的。)如果您知道要显示多少位,请替换4(在{{1那个号码;并在必要时使8(在[-4:])中的数字更大。例如:

(1<<8)

上面的最后一个示例显示了使用地图和列表的替代方法。以下示例显示了用于获取前导零的略微更清晰的形式。在这些形式中,用所需的最小位数代替8。

>>> x=0b0111
>>> map(int,list(bin((1<<8)+x))[-4:])
[0, 1, 1, 1]
>>> x=37; map(int,list(bin((1<<8)+x))[-7:])
[0, 1, 0, 0, 1, 0, 1]
>>> [int(d) for d in bin((1<<8)+x)[-7:]]
[0, 1, 0, 0, 1, 0, 1]

答案 4 :(得分:0)

检查这种简单的方法......对于这种特殊情况

In [41]: x=0b0111

In [42]: l = [0,0,0,0]

In [43]: counter = -1

In [44]: for i in str(bin(x))[2:]:
   ....:     l[counter] = i
   ....:     counter = counter -1
   ....:

In [45]: l
Out[45]: [0, '1', '1', '1']

答案 5 :(得分:0)

c=[]
for i in bin(7)[2:]: 
        c.append(int(i)) #turning string "111", to 111
if len(c)==3:
    c.insert(0,0)
print(c)

# binary digit 7 produces '0b111' by this slicing[2:], result get '111'

因此,如果列表c中的元素为3,则首先插入0。

答案 6 :(得分:0)

如果位长固定为4,则有两种解决方案:

[int(i) for i in '{0:04b}'.format(0b0111)]

或与NumPy,

import numpy as np
[int(i) for i in np.binary_repr(0b0111, 4)]

答案 7 :(得分:0)

不是很Python,但是:

byte = 0b00011001
arr = []
for i in range(7, -1, -1):
    arr.append((byte & 1<<i)>>i)
print(arr)

[0, 0, 0, 1, 1, 0, 0, 1]

这使用位掩码来“提取”每个位并追加到数组。

答案 8 :(得分:0)

给出一个数字value和位数以表示width

string = format(value, '0{}b'.format(width))
binary_list = [0 if c == '0' else 1 for c in string]

这比binary_list = [int(c) for c in string]快三分之一

答案 9 :(得分:0)

为 f-String 更新:

x = 0b0111
y = [int(i) for i in f'{x:04b}']

y = [0, 1, 1, 1]

或:

x = 0b0111 # binary representation of int 7
n_bits = 4 # desired bits' len
y = [int(i) for i in f'{x:0{n_bits}b}']

将填充最小 len n 位的列表,用前导 0 填充列表