在我們開始之前
首先,你link包含誤差活動中指出, 「任何整數小於2 [...]將安全適合在JavaScript數字。」雖然技術上是正確的,但它不是一個嚴格的限制:它可以被驗證沒有太多的麻煩,JavaScript數字可以存儲每個正整數高達2 (但不是2 + 1)。
一些代碼
事不宜遲,您所要求的功能,分裂52位數字進入底部32位和20個位:
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 };
}
哪裏拆分
我不會建議使用這些。 JavaScript的按位老年退休金計劃進行簽名(@dandavis:JS不不有UInt32s)和符號位引起頭痛,當我們真正想要的正值。 Plus V8優化了可以存儲在31位中的(帶符號)整數。結合這兩個事實,你應該在拆不超過30位,將適合在V8小整數(「SMI」)的最大正大小。
這裏的代碼,號碼拆分成30位低22位高:
function int52_30_get(i) {
var lo = i & 0x3fffffff;
var hi = (i - lo)/0x40000000;
return { lo: lo, hi: hi };
}
你可能不想雖然被創建對象。這些應該得到內聯(如果你實際上功能困擾的話):
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);
}
如果你真的確信喜和LO在範圍內可以跳過掩蔽:
function int52_30_new(hi, lo) {
return hi * 0x40000000 + lo;
}
單獨設置高,低部分:
/* set high part of i to hi */
i = (hi & 0x3fffff) * 0x40000000 + (i & 0x3fffffff);
/* set low part of i to lo */
i += (lo & 0x3fffffff) - (i & 0x3fffffff);
如果你確定HI和LO在範圍內:(因爲他們修改i
這些都不是函數)
/* set high part of i to hi */
i = hi * 0x40000000 + (i & 0x3fffffff);
/* set low part of i to lo */
i += lo - (i & 0x3fffffff);
對於額外的樂趣,功能拉出任意位字段:
function int52_30_get_bits(i, lsb, nbits) {
while (lsb >= 32) {
i /= 4294967296;
lsb -= 32;
}
return (i/(1<<lsb)) & ((1<<nbits)-1);
}
(NBITS必須< = 31時NBITS是32是有趣的,是由於的RHS操作數的僅5位低的故障模式<是顯著,一個漏洞的JavaScript規範股份與x86 ISA)比52位
更多?
完全可以使用符號位來存儲53位二進制數作爲整數,從-2 到2 -1。我沒有這樣做,但它應該很容易。之後,它開始變得有點毛茸茸的,你最終會碰到一個事實,即沒有足夠的漂浮走輪(很多都是NaN的),你到2 之前。包裝63個二進制數字轉換爲一個float應該是理論上可行,但作爲練習留給讀者:)
其他方法
另一種方法是使用類型數組,並創建一個浮動視圖和一個int觀點:這可以讓你直接操縱浮動的底層二進制表示。但是你必須開始擔心endianness之類的問題。
所有提示字符串操作的人都瘋了。
我不確定這是什麼,因爲JavaScript根本沒有整數。所有數字都是浮點數。 – 2013-10-06 20:00:06
js有UInt32s,但是你需要https://github.com/silentmatt/javascript-biginteger – dandavis
@MikeW其實我需要使用大於32位的位域。因此我需要以這種方式分割給定的數字。 – treecoder