JavaScriptでは、すべての数値は53ビットを使用して表されます。JavaScriptは浮動小数点表現を使用してすべての数値を内部に格納します。つまり、整数は浮動小数点数として格納されます(仮数は53ビットです)。
したがって、53ビットでは、最大2 ^ 53=9007199254740992を表すことができます。
ただし、右シフト演算とAND 2項演算を使用して、53ビットの数値からでも下位32ビットと上位21ビットを抽出することはできません。
その理由は、任意の数値に二項演算子を適用する場合です。Javascriptは、最初にその数値を32ビットの符号付き数値に変換し、二項演算を適用して結果を返します。これは、32より高い位置にあるビットはすべて破棄されることを意味します。
私は次のアプローチを使用して、正の数<= 2 ^ 53から上位(21ビット)と下位(32ビット)の部分を抽出しました。
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);
上記のロジックが正しいことを確認するために、2つの部分からbigNumberを作成してみましょう
Assert((lowInt * Math.pow(2, 32) + highInt) === bigNumber);