9

64ビット整数を2つの32ビット整数に分割したい:

var bigInt = 0xffffff;

var highInt = bigInt >> 8 // get the high bits 0xfff
var lowInt = bigInt // cut of the first part (with &)?

console.log(highInt); // 0xfff
console.log(lowInt); // 0xfff

// set them together again
var reBigInt = (highInt << 8) + lowInt;

残念ながら、highIntの取得もlowIntの取得も機能しません...ビット単位の演算子をどのように使用する必要があるかについて誰かに答えてもらえますか?

よろしく

4

2 に答える 2

6

EDIT JavaScriptは、 IEEE倍精度形式を使用して整数を表すため、カスタムの大きな整数ライブラリを使用する場合を除いて、精度を失うことなく任意の64ビット整数を格納する方法はありません。トリミングされる可能性のある値に対するビット演算は、明らかに意味がありません。


一般に、64ビット整数をサポートする言語の場合:

1の64ビットパターンはです0xffffffffffffffff。上位32ビットを抽出するには、32ずつシフトする必要があります>> 32。下位32ビットを抽出するには、32ビットを使用します& 0xffffffff

あなたは原則を正しく理解しました-シフトまたはマスクするビット数の計算はちょうど間違っています。

于 2013-02-06T14:48:52.957 に答える
5

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);
于 2015-03-03T05:11:26.923 に答える