我々はすべての
ファーストを開始する前に、あなたのlinkが ことを知らせるの軽微な不正確含む「2 未満の任意の全体数は、[...]安全JavaScriptの数に収まる」をしながらそれはjavascriptの数字が2 まで(ただし、2 1)すべての正の整数を格納できることをそれほど苦労せずに検証することができます。技術的に正しい、それはタイトバインドされていません。
前置き一部コード
、あなたが要求された機能、ボトム32ビット及び20上部ビットに52ビット数を分割:
function to_int52(hi, lo) {
/* range checking */
if ((lo !== lo|0) && (lo !== (lo|0)+4294967296))
throw new Error ("lo out of range: "+lo);
if (hi !== hi|0 && hi >= 1048576)
throw new Error ("hi out of range: "+hi);
if (lo < 0)
lo += 4294967296;
return hi * 4294967296 + lo;
}
function from_int52(i) {
var lo = i | 0;
if (lo < 0)
lo += 4294967296;
var hi = i - lo;
hi /= 4294967296;
if ((hi < 0) || (hi >= 1048576)
throw new Error ("not an int52: "+i);
return { lo: lo, hi: hi };
}
Iを分割しますこれらを使用することを提案しませんでした。 Javascriptのビット単位の演算が署名されています(@dandavis:JSはではなくにUInt32sを持っています)。正の値が実際に必要なときに符号ビットが頭痛を起こします。 Plus V8では、31ビットで格納できる(符号付きの)最適化が行われています。これらの2つの事実を組み合わせると、V8の小さな整数( "smi")に収まる最大の正のサイズである30ビット以内で分割する必要があります。あなたはおそらく、しかしオブジェクトを作成することにしたくない
function int52_30_get(i) {
var lo = i & 0x3fffffff;
var hi = (i - lo)/0x40000000;
return { lo: lo, hi: hi };
}
:
はここ30低ビットおよび22ビット高に数字を分割するためのコードです。 (あなたが実際にすべての機能を悩ませている場合)これらは、インライン化されるはずです:
function int52_30_get_lo(i) {
return i & 0x3fffffff;
}
function int52_30_get_hi(i) {
return (i - (i & 0x3fffffff))/0x40000000;
}
、低および高部品から数値を作成する:あなたはハイテク本当に確信している場合は
function int52_30_new_safe(hi, lo) {
return (hi & 0x3fffff) * 0x40000000 + (lo & 0x3fffffff);
}
:個別にハイとローパーツセット
function int52_30_new(hi, lo) {
return hi * 0x40000000 + lo;
}
:見よ、あなたはマスキングをスキップすることができます範囲であり、
あなたはHIとLOは範囲内にあることを確認している場合:
/* set high part of i to hi */
i = hi * 0x40000000 + (i & 0x3fffffff);
/* set low part of i to lo */
i += lo - (i & 0x3fffffff);
(彼らはi
を変更するため、これらの関数ではありません。)
余分な楽しみのために、任意引き出すための機能ビットフィールド:
function int52_30_get_bits(i, lsb, nbits) {
while (lsb >= 32) {
i /= 4294967296;
lsb -= 32;
}
return (i/(1<<lsb)) & ((1<<nbits)-1);
}
NBITSが32である場合(NBITSが< = 31故障モードでなければならないが興味深い、およびのRHSオペランドのわずか5つの下位ビットに起因するものです<が重要であり、javacript仕様がx86 ISAと共有する欠陥です。)
52ビットを超えていますか?
それから-2 -1に整数として53ビットの2進数を記憶するために符号ビットを使用することが完全に可能です。私はこれをしていないが、それは十分に簡単でなければならない。その後、少し毛むくじゃくして、最終的に2になる前に十分な浮動小数点数(多くはNaNです)がないという事実にぶつかります。。フロートに63進数を梱包理論的になんとかであるべきであるが、読者の課題として残されている:)
その他
別のアプローチに接近すると、型付き配列を使用し、フロートビューとINTビューを作成することです。これにより、浮動小数点数の基礎となるバイナリ表現を直接操作することができます。しかし、あなたはendiannessなどを心配しなければなりません。
文字列操作を提案しているすべての人々はちょうど狂っています。
Javascriptに整数がまったくないので、これを使うのはわかりません。すべての数値は浮動小数点です。 –
jsにUInt32sがありますが、https://github.com/silentmatt/javascript-bigintegerが必要です – dandavis
@MikeW実際には32ビットを超えるビットフィールドを扱う必要があります。したがって、私はそのような方法で与えられた数を分割する必要があります。 – treecoder