2012-01-28 21 views
9

मेरे पहले के प्रश्न (What is the fastest way to generate a random integer in javascript?) पर स्वीकृत उत्तर में, मैं सोच रहा था कि कैसे संख्या | के प्रतीक के माध्यम से अपना दशमलव खो देता है।जावास्क्रिप्ट में x | 0 मंजिल संख्या कैसे है?

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

var x = 5.12042; 
x = x|0; 

कैसे करता है कि मंजिल 5 को नंबर?

कुछ और उदाहरण:

console.log(104.249834 | 0); //104 
console.log(9.999999 | 0); // 9 
+2

आपको अवगत होना चाहिए कि बिटवाई ऑपरेटरों का उपयोग करके आप 32-बिट हस्ताक्षरित पूर्णांक तक सीमित हो जाएंगे। '((Math.pow (2,32)/2) -1) | 0; // 2147483647' '-1' हटाएं और आपको वांछित परिणाम नहीं मिलेगा। '((Math.pow (2,32)/2)) | 0; // -2147483648' –

+0

दिलचस्प। शायद यही कारण है कि यह कार्य 'Math.floor (x)' फ़ंक्शन से थोड़ा तेज है। http://jsperf.com/floor-or-or – user824294

+1

यह वास्तव में 'फर्श' नहीं है, यह देखने के लिए '-1.23' के साथ प्रयास करें कि – ajax333221

उत्तर

13

वजह से, ECMAScript विनिर्देशों के अनुसार, बिटवाइज़ ऑपरेटर्स ऑपरेटरों प्रत्येक अभिव्यक्ति का मूल्यांकन किया जाना पर ToInt32 कहते हैं।

11.10 Binary Bitwise Operators देखें:

  1. मूल्यांकन A:

    उत्पादन A : A @B, जहां @ ऊपर प्रस्तुतियों में बिटवाइज़ ऑपरेटर्स में से एक है, इस प्रकार के रूप में मूल्यांकन किया गया है।

  2. कॉल GetValue(Result(1)) पर कॉल करें।

  3. B का मूल्यांकन करें।

  4. कॉल GetValue(Result(3))

  5. कॉल ToInt32(Result(2)).

  6. कॉल ToInt32(Result(4)).

  7. Result(5) और Result(6) को बिटवाइज़ ऑपरेटर @ लागू करें। परिणाम एक हस्ताक्षर 32 बिट पूर्णांक है।

  8. वापसी Result(7)

5

बिटवाइज़ ऑपरेटर्स पूर्णांकों (http://es5.github.com/#x9.5 देखें) करने के लिए अपने तर्क परिवर्तित। अधिकांश भाषाओं मैं जानता हूँ कि रूपांतरण के इस प्रकार का समर्थन नहीं करते:

 
    $ python -c "1.0|0" 
    Traceback (most recent call last): 
     File "", line 1, in 
    TypeError: unsupported operand type(s) for |: 'float' and 'int' 

    $ ruby -e '1.0|0' 
    -e:1:in `': undefined method `|' for 1.0:Float (NoMethodError) 

    $ echo "int main(){1.0|0;}" | gcc -xc - 
    : In function ‘main’: 
    :1: error: invalid operands to binary | (have ‘double’ and ‘int’) 

+4

'/ अधिकांश (। *?) नहीं है/मजबूत टाइप किया गया \ 1 आम तौर पर नहीं/'(हालांकि, यह बहुत भाषा-निर्भर है।) –

2

जब एक floor कर रही है, हालांकि यह एक पूर्णांक के लिए तर्क कन्वर्ट करने के लिए संभव हो जाएगा, इस वजह से मूल प्रकार एक फ्लोटिंग प्वाइंट संख्या है सबसे अधिक भाषाओं क्या करेंगे नहीं है।

डेटा प्रकार को संरक्षित करते समय इसे करने का एक बेहतर तरीका exponent अंक mantissa में और शेष बिट्स को शून्य करना है।

यदि आप रुचि रखते हैं तो आप IEEE spec पर फ़्लोटिंग पॉइंट नंबरों पर एक नज़र डाल सकते हैं।