如何将整数转换为Python

时间:2015-06-22 01:42:03

标签: python string list

我想知道是否有比现有方法更好的方法。

我试图将一个整数表示为一个位列表,并且仅当整数是<时才将其填充到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]

6 个答案:

答案 0 :(得分:5)

对于固定大小的8位:

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]