Me gustaría ver enteros, positivos o negativos, en binario.
Más bien como esta pregunta , pero para JavaScript.
javascript
numbers
barlop
fuente
fuente
Respuestas:
Puede usar la
Number.toString(2)
función, pero tiene algunos problemas al representar números negativos. Por ejemplo, la(-1).toString(2)
salida es"-1"
.Para solucionar este problema, puede usar el operador bit a la derecha sin signo (
>>>
) para forzar su número a un entero sin signo.Si ejecuta
(-1 >>> 0).toString(2)
, desplazará su número 0 bits hacia la derecha, lo que no cambia el número en sí, pero se representará como un entero sin signo. El código anterior saldrá"11111111111111111111111111111111"
correctamente.Esta pregunta tiene más explicaciones.
fuente
Tratar
El 2 es la raíz y puede ser cualquier base entre 2 y 36
fuente aquí
ACTUALIZAR:
Esto solo funcionará para números positivos, Javascript representa enteros binarios negativos en notación de complemento a dos. Hice esta pequeña función que debería funcionar, no la he probado correctamente:
Tuve algo de ayuda de aquí
fuente
-3
devoluciones1
). También creo quedec > 0
debería serdec >= 0
, que al menos debería arreglar 0. Porquedec2Bin(0)
devuelve10
.El binario en 'convertir a binario' puede referirse a tres cosas principales. El sistema de números posicionales, la representación binaria en memoria o cadenas de bits de 32 bits. (para cadenas de bits de 64 bits, ver la respuesta de Patrick Roberts )
1. Sistema de numeración
(123456).toString(2)
convertirá números al sistema de numeración posicional de base 2 . En este sistema, los números negativos se escriben con signos menos al igual que en decimal.2. Representación interna
La representación interna de los números es de coma flotante de 64 bits y en esta respuesta se analizan algunas limitaciones . No hay una manera fácil de crear una representación de cadena de bits de esto en JavaScript ni acceder a bits específicos.
3. Máscaras y operadores bit a bit
MDN tiene una buena visión general de cómo funcionan los operadores bit a bit. En tono rimbombante:
Antes de aplicar las operaciones, los números de coma flotante de 64 bits se convierten en enteros con signo de 32 bits. Después de que se convierten de nuevo.
Aquí está el código de ejemplo MDN para convertir números en cadenas de 32 bits.
fuente
Una forma simple es solo ...
fuente
(42).toString(2)
42..toString(2)
1.
cuál es igual1.0
o solo1
(y de manera similar también puede omitir la parte anterior y escribir en.5
lugar de0.5
). Entonces, en el ejemplo, el primer punto es el separador decimal que es parte del número y el segundo punto es el operador de punto para llamar al método en ese número. Debe usar dos puntos (o ajustar el número entre paréntesis) y no puede simplemente escribir42.toString(2)
porque el analizador ve el punto como separador decimal y arroja un error debido a que falta un operador de punto.Esta respuesta intenta direccionar entradas con un valor absoluto en el rango de 2147483648 10 (2 31 ) - 9007199254740991 10 (2 53 -1).
En JavaScript, los números se almacenan en representación de coma flotante de 64 bits , pero las operaciones bit a bit los obligan a números enteros de 32 bits en formato de complemento a dos , por lo que cualquier enfoque que utilice operaciones bit a bit restringe el rango de salida a -2147483648 10 (-2 31 ) - 2147483647 10 (2 31 -1).
Sin embargo, si se evitan las operaciones bit a bit y la representación de coma flotante de 64 bits se conserva utilizando solo operaciones matemáticas, podemos convertir de manera confiable cualquier entero seguro a la notación binaria del complemento a dos de 64 bits al extender el signo de 53 bits
twosComplement
:Para navegadores antiguos, existen polyfills para las siguientes funciones y valores:
Number.isSafeInteger()
Number.isInteger()
Number.MAX_SAFE_INTEGER
String.prototype.padStart()
Como una ventaja adicional, puede admitir cualquier raíz (2–36) si realiza la conversión del complemento de dos para números negativos en ⌈64 / log 2 (raíz) ⌉ dígitos usando
BigInt
:Si está interesado en mi respuesta anterior que usaba un
ArrayBuffer
para crear una unión entre ayFloat64Array
aUint16Array
, consulte el historial de revisión de esta respuesta .fuente
-(2**53)-1
que2**53-1
en lugar de limitarse-(2**31)
a2**31-1
como respuesta de Annan.Una solución con la que estaría bien para 32 bits es el código al final de esta respuesta, que es de developer.mozilla.org (MDN), pero con algunas líneas agregadas para el formato A) y B) verificar que el El número está en el rango.
Algunos sugirieron
x.toString(2)
que no funciona para los negativos, simplemente coloca un signo menos allí para ellos, lo que no es bueno.Fernando mencionó una solución simple
(x>>>0).toString(2);
que está bien para los negativos, pero tiene un pequeño problema cuando x es positivo. Tiene la salida que comienza con 1, que para números positivos no es el complemento de 2s adecuado.Cualquiera que no entienda el hecho de que los números positivos comienzan con 0 y los números negativos con 1, en el complemento de 2s, puede verificar este SO QnA en el complemento de 2s. ¿Qué es el "Complemento de 2"?
Una solución podría implicar anteponer un 0 para números positivos, lo que hice en una revisión anterior de esta respuesta. Y uno podría aceptar a veces tener un número de 33 bits, o uno podría asegurarse de que el número a convertir esté dentro del rango - (2 ^ 31) <= x <2 ^ 31-1. Entonces el número siempre es de 32 bits. Pero en lugar de hacer eso, puedes usar esta solución en mozilla.org
La respuesta y el código de Patrick son largos y aparentemente funcionan para 64 bits, pero tenía un error que encontró un comentarista, y el comentarista corrigió el error de Patrick, pero Patrick tiene algún "número mágico" en su código sobre el que no comentó y olvidado y patrick ya no entiende completamente su propio código / por qué funciona.
Annan tenía una terminología incorrecta y poco clara, pero mencionó una solución de developer.mozilla.org https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators Esto funciona para números de 32 bits.
El código es bastante compacto, una función de tres líneas.
Pero he agregado una expresión regular para formatear la salida en grupos de 8 bits. Basado en Cómo imprimir un número con comas como separadores de miles en JavaScript (solo lo modifiqué desde agruparlo en 3s de derecha a izquierda y agregar comas , hasta agruparlo en 8s de derecha a izquierda y agregar espacios )
Y, aunque Mozilla hizo un comentario sobre el tamaño de nMask (el número introducido) ... que tiene que estar dentro del rango, no probaron ni arrojaron un error cuando el número está fuera del rango, así que he agregó eso.
No estoy seguro de por qué nombraron su parámetro 'nMask', pero lo dejaré como está.
Referencia: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators
fuente
Puede escribir su propia función que devuelve una matriz de bits. Ejemplo de cómo convertir números a bits
Divisor | Dividendo | bits / resto
2 | 9 | 1
2 | 4 | 0 0
2 | 2 | 0 0
~ | 1 | ~
ejemplo de la línea anterior: 2 * 4 = 8 y el resto es 1, entonces 9 = 1 0 0 1
Lea los restos de abajo hacia arriba. Dígito 1 en el medio hacia arriba.
fuente
Math.floor(number%2)
lugar denumber = Math.floor(number/2)
?Utilicé un enfoque diferente para llegar a algo que haga esto. Decidí no usar este código en mi proyecto, pero pensé que lo dejaría en algún lugar relevante en caso de que sea útil para alguien.
fuente
Una alternativa mas
fuente
Este es mi código:
fuente
Esta es la solución Es bastante simple de hecho
fuente