¿Qué significa la "b" en la salida del contenedor (30): "0b11110"? ¿Hay alguna forma de que pueda deshacerme de esta "b"? ¿Cómo puedo obtener que la salida de bin() siempre devuelva una salida estándar de 8 dígitos?¿Cómo puedo hacer que `bin (30)` devuelva `00011110` en lugar de` 0b11110`?
Respuesta
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'
>>>
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)
+1 para 'cadena.format' respuesta, pásame – SingleNegationElimination
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) –
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.
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'
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
pitón 2,7
de impresión "{0: b}". Formato (30)
pitón 3.x
print ('{0: b}' .formato (30))
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
tienes razón, he olvidado que imprimir en python 3.x es con(), lo editaré nuevamente – iratxe
puede utilizar el formato en Python 2 oPython 3:
>> print(format(15, '08b'))
00001111
[ 's]
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 .
- 1. ¿Cómo puedo hacer que named_scope en Rails devuelva un valor en lugar de una matriz?
- 2. ¿Cómo puedo hacer que XHR.onreadystatechange devuelva su resultado?
- 3. Cómo hacer que BackgroundWorker devuelva un objeto
- 4. ¿Cómo puedo obtener un generador de Python para que devuelva None en lugar de StopIteration?
- 5. ¿Cómo puedo hacer que una consulta SUM MySQL devuelva cero en lugar de nulo si no hay registros?
- 6. Cómo hacer que Integer.toBinaryString devuelva al menos 4 bits
- 7. ¿Cómo puedo hacer que 'import x' devuelva una subclase de types.ModuleType?
- 8. ¿Cómo puedo hacer que la función php cos devuelva el valor correcto?
- 9. ¿Cómo puedo hacer que un método devuelva un argumento que se le pasó?
- 10. ¿Cómo hacer que Groovy/Grails devuelva una Lista de objetos en lugar de una Lista de Listas de objetos?
- 11. ¿Cómo hacer que un método asíncrono devuelva un valor?
- 12. ¿Cómo puedo hacer que mi aplicación tenga un período de prueba de 30 días
- 13. ¿Cómo hacer que Select-Object devuelva un tipo sin formato (por ejemplo, String) en lugar de PSCustomObject?
- 14. Cómo hacer que Moose devuelva una instancia de clase infantil en lugar de su propia clase, para polimorfismo
- 15. Hacer que una cookie caduque en 30 segundos
- 16. ¿Cómo puedo hacer que SQL Server devuelva FALSE para comparar varchars con y sin espacios finales?
- 17. Automake generando binarios en bin/en lugar de en src/
- 18. ¿Cómo consigo que python's pprint devuelva una cadena en lugar de imprimir?
- 19. ¿Cómo hacer que Jersey use SLF4J en lugar de JUL?
- 20. ¿Puedo crear un ImageButton de ASP.NET que no se devuelva?
- 21. ¿Cómo puedo hacer que un procedimiento almacenado devuelva un "conjunto de datos" usando un parámetro que paso?
- 22. ¿Cómo hago que MySQL devuelva UTF-8?
- 23. ¿Cómo hacer que STL arroje excepciones en lugar de aserciones?
- 24. ¿Cómo puedo hacer que la página php devuelva un error 503 (o cualquier cosa que no sea 200)
- 25. ¿Cómo puedo hacer que Gson use accesadores en lugar de campos?
- 26. ¿Cómo puedo hacer que PHP muestre el error en lugar de darme 500 Internal Server Error
- 27. Cómo hacer que el XAP de Silverlight se copie al bin del cliente en la compilación
- 28. ¿Cómo obtengo System.Windows.ShowDialog() para que devuelva 'verdadero'?
- 29. ¿Cómo eliminar una carpeta (BIN) del control de versión y hacer que permanezca en TFS?
- 30. ¿Es posible que nhibernate devuelva una consulta como IDictionary en lugar de una clase de entidad?
¿Qué hay de los números negativos? – Gui13
Sorprendentemente, este parece ser el más rápido, pero ackkkk. – user3467349
@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) ' –