2013-06-04 3 views
91

Sto provando a convertire un numero intero in binario usando la funzione bin() in Python. Tuttavia, esso rimuove sempre gli zeri iniziali, che ho effettivamente bisogno, in modo tale che il risultato è sempre a 8 bit:Converti in binario e mantiene gli zeri iniziali in Python

Esempio:

bin(1) -> 0b1 

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

C'è un modo di fare questo?

+0

Consulta anche: [? Python int a binario] (http://stackoverflow.com/q/699866/562769) , in particolare [la mia risposta] (http://stackoverflow.com/a/21732313/562769) con la rappresentazione di n bit. Non esattamente la stessa cosa, ma sono arrivato a questa domanda cercando la mia risposta ... –

risposta

114

Utilizzare il format() function :

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

La funzione format() semplicemente formatta l'input seguendo lo Format Specification mini language. Il # rende il formato include il prefisso 0b e la dimensione 010 l'output per adattarsi a una larghezza di 10 caratteri, con riempimento 0; 2 caratteri per il prefisso 0b, gli altri 8 per le cifre binarie.

Questa è l'opzione più compatta e diretta.

Se si sta mettendo il risultato in una stringa più grande, utilizzare str.format() e mettere il secondo argomento per la funzione format() dopo i due punti del segnaposto {:..}:

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

Se non volevano il prefisso 0b, semplicemente cadere il # e regolare la lunghezza del campo:

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

Esattamente quello che stavo cercando, questa formattazione è davvero utile per me. Ho iniziato a imparare la manipolazione dei bit e sono stato googling per la formattazione dei bit per i numeri in Python. Trovato questo. Grazie. – kratostoical

6

È possibile utilizzare la stringa di formattazione mini lingua:

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) 

uscita:

'0b00000001' 

EDIT: sulla base di @Martijn Pieters idea

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

Lo stesso linguaggio di formattazione può essere usato per includere il prefisso per te. Usa '#'. C'è anche 'format()', che ti risparmia di dover fare un modello di stringa completo. –

+0

Grazie a @MartijnPieters, lo controllerò! –

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

See: Format Specification Mini-Language


Nota per Python 2.6 o più anziani, non è possibile omettere l'identificatore di argomento posizionale prima :, in modo da utilizzare

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

Santo ... Questo è incredibilmente stupendo! Grazie! +1 ** EDIT: ** e funziona anche con esadecimali! ''{: 02x}'. Format (16)' –

+3

Non c'è bisogno di usare 'str.format()' qui quando 'format()' farà. Ti manca il prefisso '0b'. –

+2

@MartijnPieters, 'str.format' è più flessibile di' format() 'perché ti permetterà di fare più variabili contemporaneamente. Continuo a dimenticare che la funzione 'format' esiste anche. Certo, è perfettamente adeguato in questo caso. –

0

si può usare qualcosa di simile

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

Si prega di utilizzare almeno il blocco di codice per il frammento di codice. E se vuoi davvero che sia una buona risposta, aggiungi anche alcuni commenti sul motivo per cui questa soluzione sta risolvendo la domanda OP. –

10

Sto usando

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

stamperà

'00000001' 
0
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

È possibile utilizzare zfill:

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

stampe:

01 
10 
100 

Mi piace questa soluzione, in quanto aiuta non solo durante l'output del numero, ma quando è necessario assegnarlo a una variabile ... ad es. - x = str (datetime.date.today(). Month) .zfill (2) restituirà x come '02' per il mese di feb.

+0

problema con zfill tratta la stringa binaria come una stringa e aggiunge gli zeri prima dell'indicatore b "b" ...ad esempio 'bin (14)' dà ' '0b1110'' e 'bin (14) .zfill (8)' dà ' '000b1110'' non ' '0b00001110'' che è che cosa si desidera – Shaun

1

volte si desidera solo un semplice rivestimento:

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

Python 3

+1

Nota che '[]' non dovrebbe essere necessario - 'join()' accetta un'espressione di generatore. ''' .join ('{0: 08b}'. format (ord (x)) per x in input)' –