number - undefined to string javascript
NĂºmeros negativos a cadenas binarias en JavaScript (3)
Respuesta corta:
La función
toString()
básicamente toma el decimal, lo convierte en binario y agrega un signo "-".Un desplazamiento a la derecha con cero relleno convierte su operando a un entero de 32 bits con signo en formato de dos complementos.
Una respuesta más detallada:
Pregunta 1:
//If you try
(-3).toString(2); //show "-11"
Está en la función .toString()
. Cuando saca un número a través de .toString()
:
Sintaxis
numObj.toString ([raíz])
Si el numObj es negativo, el signo se conserva. Este es el caso incluso si la raíz es 2; la cadena devuelta es la representación binaria positiva de la numObj precedida por un signo -, no el complemento de dos de la numObj.
Así que, básicamente, toma el decimal, lo convierte en binario y agrega un signo "-".
- La base 10 "3" convertida a la base 2 es "11"
- Agregar un signo nos da "-11"
Pregunta 2:
// but if you fake a bit shift operation it works as expected
(-3 >>> 0).toString(2); // print "11111111111111111111111111111101"
Un desplazamiento a la derecha con cero relleno convierte su operando a un entero de 32 bits con signo .
Los operandos de todos los operadores bit a bit se convierten en enteros de 32 bits con signo en formato de complemento a dos.
¿Alguien sabe por Number.toString
función javascript Number.toString
no representa números negativos correctamente?
//If you try
(-3).toString(2); //shows "-11"
// but if you fake a bit shift operation it works as expected
(-3 >>> 0).toString(2); // print "11111111111111111111111111111101"
Tengo curiosidad por saber por qué no funciona correctamente o cuál es el motivo por el que funciona de esta manera. Lo busqué pero no encontré nada que ayude.
-3 >>> 0 (desplazamiento lógico a la derecha) coacciona sus argumentos a enteros sin signo, por lo que obtienes la representación de complemento de dos de 32 bits de -3.
var binary = (-3 >>> 0).toString(2); // coerced to uint32
console.log(binary);
console.log(parseInt(binary, 2) >> 0); // to int32
en jsfiddle
salida es
11111111111111111111111111111101
-3