Konwertuj na binarne i zachowaj wiodące zera w Pythonie

Próbuję przekonwertować liczbę całkowitą na binarną za pomocą funkcji bin () w Pythonie. Jednak zawsze usuwa wiodące zera, których faktycznie potrzebuję, takie, że wynik jest zawsze 8-bitowy:

Przykład:

bin(1) -> 0b1

# What I would like:
bin(1) -> 0b00000001
Jest na to jakiś sposób?
Author: Peter Mortensen, 2013-06-04

8 answers

Użyj format() funkcja :

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

Funkcja format() formatuje dane wejściowe zgodnie ze specyfikacją formatu MINI language . Format # sprawia, że format zawiera prefiks 0b, A rozmiar 010 formatuje wyjście, aby zmieściło się w szerokości 10 znaków, z wypełnieniem 0; 2 znaki dla prefiksu 0b, Pozostałe 8 dla cyfr binarnych.

Jest to najbardziej kompaktowa i bezpośrednia opcja.

Jeśli stawiasz wynik w większym string, use str.format() i umieść drugi argument funkcji format() po dwukropku symbolu zastępczego {:..}:

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

Jeśli nie chcesz prefiksu 0b, po prostu upuść # i dostosuj długość pola:

>>> format(14, '08b')
'00001110'
 136
Author: Martijn Pieters,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-11 15:04:10
>>> '{:08b}'.format(1)
'00000001'

Patrz: Specyfikacja Formatu Mini-Język


Uwaga w Pythonie 2.6 lub starszym nie można pominąć identyfikatora argumentu pozycyjnego przed :, więc użyj

>>> '{0:08b}'.format(1)
'00000001'      
 87
Author: bwbrowning,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-01 11:48:02

Używam

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

Wydrukuje

'00000001'
 12
Author: rekinyz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-10 22:58:00

Możesz użyć mini języka formatowania łańcuchów:

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

Demo:

print binary(1)

Wyjście:

'0b00000001'

EDIT: na podstawie pomysłu @Martijn Pieters

def binary(num, length=8):
    return format(num, '#0{}b'.format(length + 2))
 6
Author: Peter Varo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-04 20:03:25

Czasami po prostu chcesz prosty jeden liner:

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

Python 3

 1
Author: Mark,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-02 01:45:15

Możesz użyć czegoś takiego

("{:0%db}"%length).format(num)
 0
Author: Adam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-31 16:41:58
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)
 0
Author: Daahir,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-27 11:07:08

Możesz użyć zfill:

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

Druki:

01
10
100

Podoba mi się to rozwiązanie, ponieważ pomaga nie tylko przy wypisywaniu liczby, ale gdy trzeba ją przypisać do zmiennej... np. - x = str (datetime.Data.dzisiaj ().miesiąc).zfill (2) zwróci x jako '02' za miesiąc luty.

 -1
Author: Anshul Garg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-20 14:27:10