Преобразуйте в двоичный код и сохраните ведущие нули в Python

Я пытаюсь преобразовать целое число в двоичное, используя функцию bin() в Python. Тем не менее, он всегда удаляет ведущие нули, которые мне действительно нужны, так что результат всегда 8-бит:

Пример:

bin(1) -> 0b1

# What I would like:
bin(1) -> 0b00000001

Есть ли способ сделать это?

Ответ 1

Используйте format() функцию:

>>> format(14, '#010b')
'0b00001110'

Функция format() просто форматирует входной сигнал, следующий за мини-языком Format Specification > . В # формат включает префикс 0b, а размер 010 форматирует вывод в соответствии с шириной в 10 символов с 0 дополнением; 2 символа для префикса 0b, остальные 8 для двоичных цифр.

Это самый компактный и прямой вариант.

Если вы помещаете результат в большую строку, используйте str.format() и поместите второй аргумент для функции format() после двоеточия метки-заполнителя {:..}:

>>> 'The produced output, in binary, is: {:#010b}'.format(14)
'The produced output, in binary, is: 0b00001110'

Если вам не нужен префикс 0b, просто отпустите # и отрегулируйте длину поля:

>>> format(14, '08b')
'00001110'

Ответ 2

>>> '{:08b}'.format(1)
'00000001'

Смотрите: Формат спецификации Мини-язык


Примечание для Python 2.6 или старше вы не можете опустить идентификатор позиционного аргумента до :, поэтому используйте

>>> '{0:08b}'.format(1)
'00000001'      

Ответ 3

Я использую

bin(1)[2:].zfill(8)

напечатает

'00000001'

Ответ 4

Вы можете использовать мини-язык форматирования строк:

def binary(num, pre='0b', length=8, spacer=0):
    return '{0}{{:{1}>{2}}}'.format(pre, spacer, length).format(bin(num)[2:])

Демо:

print binary(1)

Вывод:

'0b00000001'

EDIT: основанная на идее @Martijn Pieters

def binary(num, length=8):
    return format(num, '#0{}b'.format(length + 2))

Ответ 5

Иногда вам просто нужен простой один лайнер:

binary = ''.join(['{0:08b}'.format(ord(x)) for x in input])

Python 3

Ответ 6

Вы можете использовать что-то вроде этого

("{:0%db}"%length).format(num)

Ответ 7

module Adder(
    input upperBit, lowerBit, c_in,
    output s, c_out)

write gate1, gate2, gate3

xor (gate1, upperBit, lowerBit)
xor (s, gate1, c_in)
and (upperBit, lowerBit)
and (gate1, c_in)
or  (c_out, gate1, gate2)

endmodule

module ful_adder8(
    input [7:0) a, b
    input c_in
    output [7:0) s,
    output c_out)

write [7:0] carry

full_adder fa0(
    a(a[o])
    b(b[0])
    c_in(c_in)
    s(s[0])
    c_out(carry[0]))
full_adder fa0(
    a(a[o])
    b(b[0])
    c_in(c_in)
    s(s[0])
    c_out(carry[0]))
full_adder fa0(
    a(a[o])
    b(b[0])
    c_in(c_in)
    s(s[0])
    c_out(carry[0]))
full_adder fa0(
    a(a[o])
    b(b[0])
    c_in(c_in)
    s(s[0])
    c_out(carry[0]))
full_adder fa0(
    a(a[o])
    b(b[0])
    c_in(c_in)
    s(s[0])
    c_out(carry[0]))
full_adder fa0(
    a(a[o])
    b(b[0])
    c_in(c_in)
    s(s[0])
    c_out(carry[0]))
full_adder fa0(
    a(a[o])
    b(b[0])
    c_in(c_in)
    s(s[0])
    c_out(carry[0]))
full_adder fa0(
    a(a[o])
    b(b[0])
    c_in(c_in)
    s(s[0])
    c_out(carry[0]))

endmodule
test
def split (n):
    return (n&0x1,n&0x2,n&0x4,n&0x8,n&0x10,n&0x20,n&0x40,n&0x80)
def glue (b0,b1,b2,b3,b4,b5,b6,b7,c):
    t = 0
    if b0:
        t += 1
    if b1:
        t += 2
    if b2:
        t += 4
    if b3:
        t += 8
    if b4:
        t += 16
    if b5:
        t += 32
    if b6:
        t += 64
    if b7:
        t += 128
    if c:
        t += 256
    return t


def myadd (a,b):
    (a0,a1,a2,a3,a4,a5,a6,a7) = split(a)
    (b0,b1,b2,b3,b4,b5,b6,b7) = split(b)
    (s0,s1,s2,s3,s4,s5,s6,s7,c) = addEightBits(a0,a1,a2,a3,a4,a5,a6,a7,b0,b1,b2,b3,b4,b5,b6,b7,false)
    return glue (s0,s1,s2,s3,s4,s5,s6,s7,c)

Ответ 8

Вы можете использовать zfill:

print str(1).zfill(2) 
print str(10).zfill(2) 
print str(100).zfill(2)

печатает:

01
10
100

Мне нравится это решение, так как оно помогает не только при выводе числа, но когда вам нужно назначить его переменной... например - x = str (datetime.date.today(). month).zfill(2) вернет x как '02' за месяц feb.