In JavaScript werden alle Zahlen mit 53 Bits dargestellt. JavaScript verwendet Gleitkommadarstellung intern alle Zahlen zu speichern, was bedeutet, dass ganze Zahlen als Gleitkommazahlen gespeichert werden (Mantisse 53 Bit)
So mit 53 Bits wir max darstellen können 2^53 = 9007199254740992.
Aber Sie können die Rechtsverschiebung und die AND-Binäroperationen nicht verwenden, um niedrigere 32 Bits und höhere 21 Bits selbst aus 53-Bit-Zahlen zu extrahieren.
Der Grund ist, wenn wir den binären Operator auf eine beliebige Zahl anwenden - Javascript zuerst diese Zahl in 32-Bit-Zahl mit Vorzeichen konvertieren, die binäre Operation anwenden und das Ergebnis zurückgeben. Dies bedeutet, dass jedes Bit, das an einer höheren Position als 32 sitzt, verworfen wird.
Ich habe folgenden Ansatz verwendet, um die höheren (21 Bit) und niedrigeren (32 Bit) Teile von einer positiven Zahl < = 2^53 zu extrahieren.
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);
Nur um zu bestätigen, über Logik korrekt ist, können versuchen, die grossezahl von zwei Teilen bauen
Assert((lowInt * Math.pow(2, 32) + highInt) === bigNumber);
ich etwas fehlen könnte, aber da, wenn 0xFFFFFF 64 Bits ist? – m0skit0
das Prinzip der Operation ist das gleiche und sollte auch mit nicht voll verwendeten 64-Bit – bodokaiser
Shifting 8 Bits werden Sie nicht 32-Bit-Nummern, sondern 8-Bit-Nummern. – m0skit0