Conversione di numeri interi in binari in Python


179

Per convertire un numero intero in un file binario, ho usato questo codice:

>>> bin(6)  
'0b110'

e quando cancellare lo '0b', uso questo:

>>> bin(6)[2:]  
'110'

Cosa posso fare se voglio mostrare 6come 00000110anziché 110?


2
Possibile duplicato di Python int in binario?
Martin Thoma,

Risposte:


355
>>> '{0:08b}'.format(6)
'00000110'

Giusto per spiegare le parti della stringa di formattazione:

  • {} inserisce una variabile in una stringa
  • 0 accetta la variabile nella posizione argomento 0
  • :aggiunge opzioni di formattazione per questa variabile (altrimenti rappresenterebbe il decimale 6)
  • 08 formatta il numero in otto cifre con spaziatura zero a sinistra
  • b converte il numero nella sua rappresentazione binaria

Se stai usando una versione di Python 3.6 o successiva, puoi anche usare f-string:

>>> f'{6:08b}'
'00000110'

7
Il primo 0indica l' 0thargomento format. Dopo che i due punti sono la formattazione, il secondo 0significa zero riempimento a 8 spazi e bper binario
jamylak

@Aif: Inoltre, dai un'occhiata alla documentazione standard docs.python.org/library/…
pepr

19
Questo può essere semplificata con la format() funzione : format(6, '08b'); la funzione accetta un valore (a cosa si {..}applica lo slot) e una specifica di formattazione (qualunque cosa tu inserisca dopo la :stringa di formattazione).
Martijn Pieters

4
'{0:08b}'.format(-6)-> '-0000110'. cosa succede se non vuoi un cartello? struct? -6%256?
n611x007,

1
@ AK47 Sì, da Pythoon 2.6 puoi scrivere costanti int in forma binaria con prefisso 0b o 0B: 0b00000110
Denis Barmenkov,

102

Solo un'altra idea:

>>> bin(6)[2:].zfill(8)
'00000110'

Modo più breve tramite interpolazione di stringhe ( Python 3.6+ ):

>>> f'{6:08b}'
'00000110'

7
Si noti che questa soluzione è più veloce di quella accettata . Quale soluzione sia più chiara (o, oserei dire, Pythonic) è probabilmente una questione di gusti personali.
Air

Sto ancora imparando l'essenza della pitonicità, ma questo è chiaramente molto più versatile. Inizialmente ero entusiasta di vedere la soluzione accettata con la sua elegante spiegazione, ma allarmato dal fatto che l'oggetto chiamato a fare i metodi fosse scritto come una singola stringa con tutte le specifiche integrate, eliminando il coinvolgimento delle variabili in cose come la lunghezza desiderata della stringa di bit. Questo risolve completamente ed è così intuitivo (almeno per Python 2) che non c'è bisogno di spiegare ogni personaggio!
Post169,

Non funziona per numeri interi negativi bin(-6)[2:].zfill(8)come'0000b110'
jlandercy

20

Un po 'il metodo di twiddling ...

>>> bin8 = lambda x : ''.join(reversed( [str((x >> i) & 1) for i in range(8)] ) )
>>> bin8(6)
'00000110'
>>> bin8(-3)
'11111101'

1
Bel metodo. Ma non riuscivo a capire cosa stia facendo questa parte del tuo codice: str ((x >> i) & 1)
Gregory

2
@Gregory: sposta i bit xverso destra e li esegue con 1, estraendo efficacemente un bit (0 o 1) alla volta.
usr2564301,

16

Basta usare la funzione di formattazione

format(6, "08b")

La forma generale è

format(<the_integer>, "<0><width_of_string><format_specifier>")

1
Sì, mi piace questo, è semplice e uno dei più veloci :-) 1000000 loops, best of 3: 556 ns per loop
SebMa,

10

La risposta di eumiro è migliore, tuttavia sto solo pubblicando questo per varietà:

>>> "%08d" % int(bin(6)[2:])
00000110

3
Eh. Questo è così profondamente sbagliato, ho dovuto votarlo. L'interpretazione delle cifre come decimali è scaltro. Ancora peggio:'%08x' % int(bin(6)[2:], 16)
Mad Physicist,

6

.. o se non sei sicuro che dovrebbe sempre essere di 8 cifre, puoi passarlo come parametro:

>>> '%0*d' % (8, int(bin(6)[2:]))
'00000110'

5

numpy.binary_repr(num, width=None) ha un argomento di larghezza magica

Esempi rilevanti dalla documentazione collegata sopra:

>>> np.binary_repr(3, width=4)
'0011'

Il complemento a due viene restituito quando il numero di input è negativo e viene specificata la larghezza:

>>> np.binary_repr(-3, width=5)
'11101'

4

La vecchia scuola funziona sempre

def intoBinary(number):
binarynumber=""
if (number!=0):
    while (number>=1):
        if (number %2==0):
            binarynumber=binarynumber+"0"
            number=number/2
        else:
            binarynumber=binarynumber+"1"
            number=(number-1)/2

else:
    binarynumber="0"

return "".join(reversed(binarynumber))

number=number/2dà galleggiante, quindi number=number//2cuciture migliori, anche io vorrei sostituire number=number//2con number//=2e b=b+"0"conb+="0"
Brambor

inoltre, non hai l'imbottitura 0 come richiesto dall'OP
Brambor,

1
('0' * 7 + bin(6)[2:])[-8:]

o

right_side = bin(6)[2:]
'0' * ( 8 - len( right_side )) + right_side

2
Mentre questo codice può rispondere alla domanda, fornire un contesto aggiuntivo riguardo a come e / o perché risolve il problema migliorerebbe il valore a lungo termine della risposta.
Nic3500,

0

Supponendo che tu voglia analizzare il numero di cifre usato per rappresentare da una variabile che non è sempre costante, un buon modo sarà usare numpy.binary.

potrebbe essere utile quando si applica binario ai gruppi di alimentazione

import numpy as np
np.binary_repr(6, width=8)

0

Il modo migliore è specificare il formato.

format(a, 'b')

restituisce il valore binario di a in formato stringa.

Per convertire una stringa binaria in numero intero, utilizzare la funzione int ().

int('110', 2)

restituisce il valore intero della stringa binaria.


Meglio sarebbe il formato (a, '08b') per ottenere il formato desiderato dall'utente.
ZSG

0
def int_to_bin(num, fill):
    bin_result = ''

    def int_to_binary(number):
        nonlocal bin_result
        if number > 1:
            int_to_binary(number // 2)
        bin_result = bin_result + str(number % 2)

    int_to_binary(num)
    return bin_result.zfill(fill)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.