msd - JavaScript: desplazamiento en el sentido de los bits de un número largo largo
msdn javascript (2)
Necesito desplazar un valor bit a bit 64 veces en JavaScript. Pero JavaScript comienza a redondearse después de 32
.
Por ejemplo:
for(var j = 0; j < 64; j++)
{
mask = mask << 1;
console.log(mask);
}
Esto imprime el valor de 0
a 1073741824
pero luego rondas de y comienza a imprimir 0
.
"En Java, los operadores bit a bit trabajan con enteros. JavaScript no tiene enteros. Solo tiene números de coma flotante de precisión doble. Por lo tanto, los operadores bit a bit convierten sus operandos numéricos en enteros, hacen sus negocios y luego los vuelven a convertir. En la mayoría de los lenguajes, estos operadores están muy cerca del hardware y muy rápido. En JavaScript, están muy lejos del hardware y son muy lentos. JavaScript rara vez se utiliza para manipular los bits ". - Douglas Crockford, Javascript: Las buenas partes
El punto es que realmente no tienes ninguna razón para usar operadores bit a bit. Simplemente multiplique o divida por 2 ^ numbits.
Tu código debería ser:
for(var j = 0; j < 64; j++) {
mask = mask * 2;
console.log(mask);
}
O en general:
function lshift(num, bits) {
return num * Math.pow(2,bits);
}
Entiendes la idea.
JavaScript almacena todos sus números como 64 bit initally, pero tan pronto como comienzas a usar operadores bit a bit el intérprete convierte el número a una representación de 32 bits.
Los operadores bit a bit son un poco hacky en JS y tan molesto que probablemente tendrá que hacer algo un poco más inteligente, como escribir sus propias funciones de 64 bits.