2008-12-03 10 views
13

की बिटवाइस पारी मैं जावास्क्रिप्ट में एक मूल्य के बदलाव 64 गुना बिटवाइज़ की जरूरत है। लेकिन जावास्क्रिप्ट 32 के बाद गोल करना शुरू कर देता है।जावास्क्रिप्ट: लंबे संख्या

उदाहरण के लिए:

for(var j = 0; j < 64; j++) 
{ 
    mask = mask << 1; 
    console.log(mask); 
} 

यह प्रिंट 0 से की 1073741824 लेकिन फिर दौर और 0 मुद्रण शुरू होता है के लिए मूल्य।

उत्तर

27

"जावा में, बिटवाइज़ ऑपरेटर्स पूर्णांकों के साथ काम करते हैं। जावास्क्रिप्ट पूर्णांक नहीं है। यह केवल डबल परिशुद्धता चल बिन्दु संख्या। तो, बिटवाइज़ ऑपरेटर्स उनकी संख्या ऑपरेंड पूर्णांक में बदल गया है, उनके व्यापार करते हैं, और उसके बाद उन्हें वापस परिवर्तित करें। अधिकांश भाषाओं में, ये ऑपरेटर हार्डवेयर के बहुत करीब हैं और बहुत तेज़ हैं। जावास्क्रिप्ट में, वे हार्डवेयर से बहुत दूर हैं और बहुत धीमे हैं। जावास्क्रिप्ट का शायद ही कभी कम हेरफेर करने के लिए उपयोग किया जाता है। " - डगलस Crockford, Javascript: The Good Parts

मुद्दा यह है कि क्या तुम सच में बिटवाइज़ ऑपरेटर्स का उपयोग करने के किसी भी कारण नहीं है। बस 2^numbits द्वारा गुणा या विभाजित करें।

आपका कोड होना चाहिए:

for(var j = 0; j < 64; j++) { 
mask = mask * 2; 
console.log(mask); 
} 

या आम तौर पर:

function lshift(num, bits) { 
    return num * Math.pow(2,bits); 
} 

आप अंदाजा हो।

+8

जेएसपेर्फ ने कहा नहीं। http://jsperf.com/multiply-vs-divide/9 – Shinjikun

9

जावास्क्रिप्ट भंडार के रूप में 64 बिट initally अपने सभी नंबरों को है, लेकिन जैसे ही आप दुभाषिया एक 32 बिट प्रतिनिधित्व करने के लिए संख्या धर्मान्तरित बिटवाइज़ ऑपरेटर्स का उपयोग शुरू कर के रूप में ..

बिटवाइज़ ऑपरेटर्स हैं जे एस में और तो annoyingly hacky एक सा आपको शायद कुछ और चालाक करना होगा, जैसे कि अपने 64 बिट फ़ंक्शंस लिखना।

+3

जे एस संख्या 53 बिट के एक अपूर्णांश, नहीं 64 वास्तव में है। – lapo

+3

जावास्क्रिप्ट में भाषा में दृश्यमान प्रकार के रूप में पूर्णांक नहीं हैं; सभी संख्याएं डबल-परिशुद्धता (64-बिट) फ़्लोटिंग पॉइंट हैं। वे केवल मंटिसा के 53 बिट तक पकड़ सकते हैं, जो एक 64-बिट पूर्णांक फिट नहीं होगा। तो जब यह पूर्णांक और पीछे आंतरिक रूपांतरण करता है, तो यह केवल 32 बिट्स का उपयोग करता है। –

संबंधित मुद्दे