2008-12-03 9 views
13

Necesito desplazar un valor 64 veces en bits en JavaScript. Pero JavaScript comienza a redondearse después de 32.JavaScript: desplazamiento en bits del número larga larga

Por ejemplo:

for(var j = 0; j < 64; j++) 
{ 
    mask = mask << 1; 
    console.log(mask); 
} 

Este valor impresiones de 0 a 1073741824 pero luego rondas de e inicia la impresión 0.

Respuesta

27

"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 su trabajo y luego 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 usa para manipular los bits ". - Douglas Crockford, Javascript: The Good Parts

El punto es que realmente no tiene ningún motivo para utilizar operadores bit a bit. Simplemente multiplique o divida por 2^numbits.

El 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); 
} 

Usted consigue la idea.

+8

jsPerf dijo que no. http://jsperf.com/multiply-vs-divide/9 – Shinjikun

9

tiendas de JavaScript todas sus números de 64 bits digan, pero tan pronto como empiece a usar operadores bit a bit el intérprete convierte el número a una representación de 32 bits ..

operadores bit a bit son un poco hacky en JS y así molestamente probablemente tendrá que hacer algo un poco más inteligente, como escribir sus propias funciones de 64 bits.

+3

Los números JS tienen una mantisa de 53 bits, no 64 en realidad. – lapo

+3

Javascript no tiene enteros como un tipo visible en el idioma; todos los números son de coma flotante de doble precisión (64 bits). Esos solo pueden contener hasta 53 bits de mantisa, en los que un entero de 64 bits no encajará. Entonces cuando hace la conversión interna a entero y viceversa, solo usa 32 bits. –