2012-04-06 7 views
10

Por ejemplo, ¿cómo obtener la respuesta correcta al 137438953472 & 137438953472?¿Cómo hago un bitwise y en números mayores a 2^32 en Javascript?

Javascript devuelve 0 si los operandos están entre 2^32 y 2^53 (max int).

+0

Solo para aclarar, usted está buscando _realmente_ hacer una operación de bit "y", como lo indica el 'y', ¿correcto? – cdeszaq

+1

[Esta respuesta] (http://stackoverflow.com/questions/307179/what-is-javascripts-max-int-whats-the-highest-integer-value-a-number-can-go-t) puede ser de interés para usted. > los operadores bit a bit y los operadores de turno operan en entradas de 32 bits. Y 2^53 parece ser un valor de 64 bits. –

Respuesta

8

autorización aquí es lo que me ocurrió con sólo probado con enteros sin signo < 2^53:

edición: clavado un error cuando los resultados parciales se interpretan como firmados

function and(op1, op2) { 

    var mod = Math.pow(2, 32), 
     op1mod = op1 % mod, 
     op2mod = op2 % mod, 
     op164to32, 
     op264to32, 
     res32, res64, res; 

     op1 -= op1mod; 
     op2 -= op2mod; 

     res32 = (op1mod & op2mod) >>> 0; 


     op164to32 = op1/mod; 
     op264to32 = op2/mod; 
     res64 = (op164to32 & op264to32) >>> 0; 

     res = res64 * mod + res32; 
     return res; 
} 

and(137438953473, 137438953473) 
//137438953473 
and(137439087606, 137438953473) 
//137438953472 
and(0xCAFECAFECAFE, 0xBABEBABEBABE) 
//152550976162494 

resultados confirmados a ser correcta con la calculadora de Windows de 64 bits: P

+0

Sí, me preguntaba acerca de su respuesta original (eliminada). Lo voté por encima, aunque parecía que produciría un resultado incorrecto. –

+0

Podría necesitar más pruebas, por favor coméntelo aquí si lo encuentra dando un resultado incorrecto con unsigned <2^53 – Esailija

+0

podría escribirse un poco más fácil (al menos para mí): '((Math.floor (operand1/i32) & Math.floor (operando2/i32)) * i32 + ((operando1% i32) & (operando2% i32)) 'donde i32 = 4294967296; (2^32). – Alena

Cuestiones relacionadas