जावास्क्रिप्ट में सभी नंबरों को 53 बिट्स के प्रयोग किया जाता है। जावास्क्रिप्ट जिसका अर्थ है कि पूर्णांक चल बिन्दु संख्या (अपूर्णांश 53 बिट है)
तो 53 बिट के साथ हम अधिकतम प्रतिनिधित्व कर सकते हैं के रूप में जमा हो जाती है, सभी नंबरों को आंतरिक रूप से स्टोर करने के लिए चल बिन्दु प्रतिनिधित्व का उपयोग करता है 2^53 = 9007199254740992.
लेकिन आप 53 बिट संख्याओं से भी कम 32 बिट्स और उच्च 21 बिट्स निकालने के लिए सही शिफ्ट और बाइनरी ऑपरेशंस का उपयोग नहीं कर सकते हैं।
कारण यह है कि जब हम किसी भी संख्या पर बाइनरी ऑपरेटर लागू करते हैं - जावास्क्रिप्ट पहले उस संख्या को 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);
बस ऊपर तर्क सही है की पुष्टि के लिए, चलो दो भागों
Assert((lowInt * Math.pow(2, 32) + highInt) === bigNumber);
स्रोत
2015-03-03 05:11:26
मैं कुछ याद आ रही हो सकता है से लेकिन जब से जब 0xFFFFFF 64 बिट्स है bigNumber निर्माण की कोशिश? – m0skit0
आपरेशन के सिद्धांत एक ही है और पूरा इस्तेमाल नहीं किया 64bits – bodokaiser
8 बिट आप 32-बिट नंबर नहीं देंगे स्थानांतरण, लेकिन 8 बिट संख्या के साथ भी काम करना चाहिए। – m0skit0