我想知道是否有比现有方法更好的方法。
我试图将一个整数表示为一个位列表,并且仅当整数是<时才将其填充到8位。 128 :
Example input: 0x15
Desired output: [0, 0, 0, 1, 0, 1, 0, 1]
我是按照以下方式做的:
input = 0x15
output = deque([int(i) for i in list(bin(input))[2:]])
while len(output) != 8:
output.appendleft(0)
在python中有更好的方法吗?
修改 我想将任何整数转换为二进制列表。仅当数字需要少于8位来表示时才填充到8。
Another Example input: 0x715
Desired output: [1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 1]
答案 0 :(得分:5)
num = 0x15
out = [1 if num & (1 << (7-n)) else 0 for n in range(8)]
(1 << (7-n))
为给定位置创建单个位掩码,然后逐位&
测试以查看该位是否设置了该位。让n
在0到7之间工作会导致字节中的所有8位按顺序进行测试。
import math
num = 0x715
bits = int(max(8, math.log(num, 2)+1))
out = [1 if num & (1 << (bits-1-n)) else 0 for n in range(bits)]
答案 1 :(得分:5)
>>> [int(n) for n in bin(0x15)[2:].zfill(8)]
[0, 0, 0, 1, 0, 1, 0, 1]
切片[2:]
将删除0b
前缀,zfill(8)
将填充左侧的零。
答案 2 :(得分:3)
使用格式字符串
很容易做到这一点>>> "{:08b}".format(0x15)
'00010101'
>>> "{:08b}".format(0x151)
'101010001'
>>> "{:08b}".format(0x1511)
'1010100010001'
转换为列表
>>> [1 if x=='1' else 0 for x in "{:08b}".format(0x15)]
[0, 0, 0, 1, 0, 1, 0, 1]
>>> [1 if x=='1' else 0 for x in "{:08b}".format(0x1511)]
[1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1]
在@ Amber的回答中使用bit twidling可能会更快,但是你必须检查特殊情况并最终得到相当多的代码。如果不需要最高性能,那么建立在您已知的工作基础上更安全
答案 3 :(得分:2)
input = 0x15
output = [int(x) for x in '{:08b}'.format(input)]
{0:0=8b}'.format(0x15)
代表input
binary
格式,0 padding
到8位,然后使用列表推导来创建位列表。
或者,您可以使用map
功能:
output = map(int, [x for x in '{:08b}'.format(0x15)])
编辑:可变位宽,
如果你想让位数变量,这里有一种方法:
width = 8 #8bit width
output = [int(x) for x in '{:0{size}b}'.format(0x15,size=width)]
output = map(int, [x for x in '{:0{size}b}'.format(0x15,size=width)])
这是在Python 2.7中测试的
答案 4 :(得分:0)
您可以向右移动数字x步骤,然后按位进行,将结果改为1以获得位置x
的位,使用list-comprehension执行此操作并获得列表。如果您需要支持负数,我们可能需要在列表中添加前导零以确保正数不以1开头:
import math
def bits(n):
# The number of bits we need to represent the number
num_bits = max(8, int(math.log(abs(n), 2)) + 1)
# The bit representation of the number
bits = [ (n >> i) & 1 for i in range(num_bits) ]
bits.reverse()
# Do we need a leading zero?
if n < 0 or bits[0] == 0:
return bits
return [0] + bits
# Examples
for n in (-0x15, 0x15, 128, 255, 256, -256):
print("{: 4} = {}".format(n, bits(n)))
-21 = [1, 1, 1, 0, 1, 0, 1, 1] 21 = [0, 0, 0, 1, 0, 1, 0, 1] 128 = [0, 1, 0, 0, 0, 0, 0, 0, 0] 255 = [0, 1, 1, 1, 1, 1, 1, 1, 1] 256 = [0, 1, 0, 0, 0, 0, 0, 0, 0, 0] -256 = [1, 0, 0, 0, 0, 0, 0, 0, 0]
答案 5 :(得分:0)
from math import ceil
input = 0x15
bin_string = bin(input)[2:]
binary = map(int,bin_string.zfill(int(ceil(len(bin_string)/8.0)*8)))
print(binary)
这将舍入到最接近的8的倍数,如果你只想在&lt; 128时想要舍入到8的倍数,请使用简单的if else语句并在else中删除zfill
输出0x15:
[0, 0, 0, 1, 0, 1, 0, 1]
输出0x715:
[0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 1]
如果您只想添加零(如果小于128),请使用:
input = 0x715
bin_string = bin(input)[2:]
num_bits = (8 if input < 128 else 0)
binary = map(int,bin_string.zfill(num_bits))
print(binary)
输出0x15:
[0, 0, 0, 1, 0, 1, 0, 1]
输出0x715:
[1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 1]