2009-09-08 13 views

Respuesta

45

Usando zfill():

Return la cadena numérica izquierda rellena con ceros en una cadena de longitud anchura. Un prefijo de signo se maneja correctamente. La cadena original se devuelve si el ancho es menor que len (s).

>>> bin(30)[2:].zfill(8) 
'00011110' 
>>> 
+4

¿Qué hay de los números negativos? – Gui13

+0

Sorprendentemente, este parece ser el más rápido, pero ackkkk. – user3467349

+0

@loannis Su edición causó problemas porque ahora se proporcionó el resultado incorrecto para valores negativos, -30! = 30 mientras que su edición da como resultado 'bin (30) .lstrip (' - 0b '). Zfill (8) == bin (-30) .lstrip ('- 0b'). Zfill (8) ' –

27

0b es como 0x - indica que el número está formateado en binario (0x indica que el número está en hexadecimal).

Ver How do you express binary literals in python?

Ver http://docs.python.org/dev/whatsnew/2.6.html#pep-3127-integer-literal-support-and-syntax

a quitarse la 0b que es más fácil de usar cuerdas rebanar: bin(30)[2:]

Y del mismo modo para el formato de 8 caracteres anchos:

('00000000'+bin(30)[2:])[-8:] 

Alternativamente puede usar string formatter (en 2.6+) para hacerlo todo en un solo paso:

"{0:08b}".format(30) 
+6

+1 para 'cadena.format' respuesta, pásame – SingleNegationElimination

+0

Para este caso, prefiero el formato construido en función en lugar del método de formato: formato (30, '08b') en lugar de" {0: 08b } ". format (30) –

13

tomar ventaja de la famosa función format() con el segundo argumento menos conocida y la cadena con zfill()

'b' - binario 'x' - Hex 'o' - Octal 'd' - Decimal

>>> print format(30, 'b') 
11110 
>>> print format(30, 'b').zfill(8) 
00011110 

Should do. Aquí 'b' significa binario al igual que 'x', 'o' & 'd' para hexadecimal, octal y decimal, respectivamente.

0

Las respuestas actuales no consideran los valores negativos (¡gracias @ Gui13 por el comentario!) En cuyo caso obtienes -0b... en lugar de solo 0b.... Puede manejar tanto con un simple if-else donde se comprueba el valor si es menor que cero o no

>>> def printBit(x): 
    if x < 0: 
     return '-' + bin(x)[3:].zfill(8) # replace 
    else: 
     return bin(x)[2:].zfill(8) 

>>> print(printBit(30)) 
'00011110' 
>>> print(printBit(-30)) 
'-00011110' 

o utilizando replace()

>>> print(bin(30)).replace('0b', '').zfill(8) 

El problema con la llamada anterior es que uno de los bits se "pierde" en el signo - debido al mismo valor que se usa para el zfill().Puede manejar esto también con una simple comprobación ternaria:

>>> x = 30 
>>> print(bin(x)).replace('0b', '').zfill(9 if x < 0 else 8) 
'00011110' 

>>> x = -30 
>>> print(bin(x)).replace('0b', '').zfill(9 if x < 0 else 8) 
'-00011110' 

Por último, pero no menos importante, también puede hacer que el zfill() para adaptar automáticamente el número de 0 s para que coincida con un byte (8 bits) o un número n de bits cuadrúpedos (4 bits):

>>> def pb(x): 
    bres = bin(x).replace('0b', '').replace('-', '') # If no minus, second replace doesn't do anything 
    lres = len(bres) # We need the length to see how many 0s we need to add to get a quadruplets 
    # We adapt the number of added 0s to get full bit quadruplets. 
    # The '-' doesn't count since we want to handle it separately from the bit string 
    bres = bres = ('-' if x < 0 else '') + bres.zfill(lres + (4-lres%4)) 

    return bres 

>>> print(pb(7)) 
'0111' 
>>> print(pb(-7)) 
'-0111' 
>>> print(pb(30)) 
'00011110' 
>>> print(pb(-30)) 
'-00011110' 

Aquí está la versión final con relleno adaptable de 0 s y división adicional con el espacio de cada n caracteres (donde el n se determina por el factor de llenado):

>>> def pb(x, fillingBits=4, splitWithSpace=True): 
    # If no minus, second replace doesn't do anything 
    bres = bin(x).replace('0b', '').replace('-', '') 
    lres = len(bres) 

    bres = bres.zfill(lres + (fillingBits - (lres % fillingBits))) 
    lres = len(bres) 

    # We can also add a blank after every fillingBits character 
    if splitWithSpace: 
     bres = ' '.join([bres[i:(i + fillingBits)] for i in range(0, lres, fillingBits)]) 

    bres = ('-' if x < 0 else '') + bres 
    # We remove any trailing/leading blanks (occurring whenever splitWithSpace enabled) 
    return bres.strip() 

>>> print(pb(7)) 
'0111' 
>>> print(pb(-7)) 
'-0111' 
>>> print(pb(30)) 
'0001 1110' 
>>> print(pb(-30)) 
'-0001 1110' 
+0

Lectura antes de actuar como" inteligente ". El OP pregunta claramente sobre el relleno más el hecho de que 'bin()' (al menos en el momento en que escribí esta respuesta) NO maneja dos complementos y un número negativo se devuelve como '-' seguido del binario convertido. La respuesta aceptada incluso elimina el '-', lo que hace que los resultados en un ser negativo sean los mismos que un número positivo. – rbaleksandar

0

pitón 2,7

de impresión "{0: b}". Formato (30)

pitón 3.x

print ('{0: b}' .formato (30))

+0

Ambos fragmentos funcionarán en python 2.x y ambos generarán un error de sintaxis en python 3.x, ya que imprimir es una función en 3.x. ¿Quizás quiso hacer que el segundo fragmento 'print (" {0: b} ". Format (30))'? – kristaps

+0

tienes razón, he olvidado que imprimir en python 3.x es con(), lo editaré nuevamente – iratxe

0

puede utilizar el formato en Python 2 oPython 3:

>> print(format(15, '08b')) 
00001111 

[ 's]

0

Usted puede utilizar esto también:

bi=bin(n)[2:] 

Esto eliminará la parte '0b' del valor devuelto y se puede utilizar la salida de cualquier parte .

Cuestiones relacionadas