Intentando alguna manipulación de bits en javascript.
Considera lo siguiente:
const n = 4393751543811; console.log(n.toString(2)) // '111111111100000000000000000000000000000011' console.log(n & 0b11) // last two bits equal 3 const m = n >> 2; // right shift 2 // The unexpected. console.log(m.toString(2)) // '0'
El resultado es 0? El resultado esperado que estoy buscando después del cambio a la derecha es:
111111111100000000000000000000000000000011 // pre 001111111111000000000000000000000000000000 // post >>
¿Cómo se logra esto?
Los operadores bit a bit de Javascript en números funcionan "como si" en enteros de 32 bits.
>>
(desplazamiento a la derecha de propagación de signos para números) primero se convertirá a un entero de 32 bits . Si lee la especificación vinculada, tenga en cuenta específicamente
Sea int32bit int módulo 2 32 .
En otras palabras, todos los bits por encima de 32 simplemente se ignorarán. Para su número, esto da como resultado lo siguiente:
111111111100000000000000000000000000000011 ┗removed━┛┗━━━━━━━━━━━━━━32bit━━━━━━━━━━━━━┛
Si quieres, puedes usar BigInt
:
const n = 4393751543811n; // note the n-suffix console.log(n.toString(2)) console.log(n & 0b11n) // for BigInt, all operands must be BigInt const m = n >> 2n; // The expected. console.log(m.toString(2))
La especificación para >>
en BigInt
usa BigInt::leftShift(x, -y)
, donde a su vez establece:
La semántica aquí debería ser equivalente a un cambio bit a bit, tratando BigInt como una cadena de longitud infinita de dígitos de complemento a dos binarios.