In JavaScript tutti i numeri sono rappresentati utilizzando 53 bit. JavaScript utilizza rappresentazione in virgola mobile per memorizzare tutti i numeri internamente, il che significa che gli interi vengono memorizzate come numeri in virgola mobile (mantissa ha 53 bit)
Così con 53 bit possiamo rappresentare max 2^53 = 9007199254740992.
Ma non è possibile utilizzare il passaggio a destra e le operazioni binarie AND per estrarre meno 32 bit e più alti 21 bit anche da numeri a 53 bit.
Il motivo è quando applichiamo un operatore binario su qualsiasi numero: Javascript converte prima quel numero in numero con segno a 32 bit, applica l'operazione binaria e restituisce il risultato. Ciò significa che qualsiasi bit che si trova in una posizione superiore a 32 verrà scartato.
Ho utilizzato il seguente approccio per estrarre le porzioni superiori (21 bit) e inferiori (32 bit) da un numero positivo < = 2^53.
var bigNumber = Math.pow(2, 53); // 9007199254740992
var bigNumberAsBinaryStr = bigNumber.toString(2); // '100000000000000000000000000000000000000000000000000000'
// Convert the above binary str to 64 bit (actually 52 bit will work) by padding zeros in the left
var bigNumberAsBinaryStr2 = '';
for (var i = 0; i < 64 - bigNumberAsBinaryStr.length; i++) {
bigNumberAsBinaryStr2 += '0';
};
bigNumberAsBinaryStr2 += bigNumberAsBinaryStr;
var lowInt = parseInt(bigNumberAsBinaryStr2.substring(0, 32), 2);
var highInt = parseInt(bigNumberAsBinaryStr2.substring(32), 2);
solo per confermare sopra logica è corretta, lascia provare a costruire il BigNumber da due parti
Assert((lowInt * Math.pow(2, 32) + highInt) === bigNumber);
fonte
2015-03-03 05:11:26
potrei mancare qualcosa, ma da quando 0xFFFFFF è di 64 bit? – m0skit0
il principio dell'operazione è lo stesso e dovrebbe funzionare anche con 64 bit non completamente utilizzati – bodokaiser
Maiuscole 8 bit non ti forniranno numeri a 32 bit, ma numeri a 8 bit. – m0skit0