2013-04-12 10 views
8

सबसे आम तौर पर मॉड्यूलो ऑपरेटर % का उपयोग किसी भी या विषम संख्या के विरुद्ध परीक्षण करने के लिए किया जाता है।विषम संख्याओं के खिलाफ परीक्षण

अब मेरी सवाल है, वहाँ एक विषम संख्या के खिलाफ किसी भी समस्या के परीक्षण के एक बिटवाइज़ उपयोग कर रहा है और, के रूप में यह और अधिक प्राकृतिक परीक्षण दायीं बिट है कि क्या 1 या 02

और के खिलाफ एक सापेक्ष जांच कर रही है की तुलना में महसूस करता है क्योंकि 32 बिट रूपांतरण सही बिट नहीं बदलता है।

दोनों

(1 + Math.pow(2,52)) & 1 //1

और

(1 + Math.pow(2,52)) % 2 //1

समान ही परिणाम।

क्या बिटुलो पर मॉड्यूलो ऑपरेटर को प्राथमिकता देने का कोई कारण है?

संपादित करें: यह सवाल केवल मूल्यों है कि 64 बिट परिशुद्धता की सीमा में आते हैं के रूप में केवल सम संख्याएं ऊपर 2^53 सटीक दर्शाया जा सकता है के लिए खातों और इसलिए दोनों ऑपरेंड असफल (जावास्क्रिप्ट में 9007199254740993 % 2 //0)

+1

मॉड्यूलो का विभाजन शेष भाग को खोजने के लिए किया जाता है। संयोग से, इसे समानता-जांच के रूप में उपयोग किया जा सकता है। – Shark

+2

महान सवाल! – Pointy

+0

@ पॉइंट धन्यवाद =) – C5H8NNaO4

उत्तर

7

, किसी भी उपयोग bitwise ऑपरेटर को 32-बिट पूर्णांक के लिए पहली बार छोटा करने का कारण बनता है। इसका मतलब है कि यह कुछ बड़े मानों के लिए काम नहीं करेगा। (ठीक है, कुछ बड़े मान :-)

% ऑपरेटर नहीं करता वह

संपादित करें — अरे आप सभी अच्छे लोगों ने मुझे उखाड़ फेंक दिया है: अपने घोड़ों को पकड़ें :-) C5H8NNaO4 बताते हैं कि पूर्णांक छंटनी प्रक्रिया को कम बिट को संरक्षित करना चाहिए, जो सहज ज्ञान को समझता है यदि आप केवल शीर्ष भाग को छोड़ने के बारे में सोचते हैं मंटिसा के, और वास्तव में कुछ कर्सर "परीक्षण" इंगित करते हैं कि यह ठीक काम करता प्रतीत होता है।

वास्तव में बड़े मानों के लिए चीजें अधिक जटिल हो जाती हैं, जो कमजोर फ्लोटिंग पॉइंट में प्रतिनिधित्व करते समय अजीब या यहां तक ​​कि कम से कम महत्वपूर्ण अंक गायब हो सकते हैं। दूसरे शब्दों में, जब एक फ्लोटिंग पॉइंट वैल्यू में द्विआधारी एक्सपोनेंट का परिणाम प्रभावी मूल्य में होता है जो मंथिसा क्षमता (53 बिट्स मुझे लगता है) से बड़ा है, तो आपको या तो इन सभी संख्याओं पर विचार करना होगा (क्योंकि कम बिट हमेशा शून्य होते हैं) अन्यथा आपको अनिश्चित प्रश्न पर विचार करना होगा।

यह स्पष्ट होना चाहिए कि मैं गणितज्ञ नहीं हूं।

+0

+1 बिटवाई ऑपरेटरों के संबंध में अतिरिक्त। क्रॉकफोर्ड के अच्छे हिस्सों से उधार लेने के लिए: 'जावास्क्रिप्ट में पूर्णांक नहीं हैं। इसमें केवल डबल परिशुद्धता फ़्लोटिंग-पॉइंट नंबर हैं। इसलिए, बिटवाई ऑपरेटर अपने नंबर ऑपरेंड को पूर्णांक में परिवर्तित करते हैं, अपना व्यवसाय करते हैं, और फिर उन्हें वापस परिवर्तित करते हैं। ज्यादातर भाषाओं में, ये ऑपरेटर हार्डवेयर के बहुत करीब हैं और बहुत तेज़ हैं। जावास्क्रिप्ट में, वे हार्डवेयर से बहुत दूर हैं और बहुत धीमी हैं। जावास्क्रिप्ट का उपयोग शायद ही कभी मैनिप्ल्यूशन करने के लिए किया जाता है। – Nope

+0

उत्कृष्ट उत्तर। और जो भी चिंता करता है कि '% 'को पूर्णांक शर्तों में परिभाषित किया जा सकता है, यह नहीं है: http://www.ecma-international.org/ecma-262/5.1/#sec-11.5.3 –

+2

समानता जांच के लिए, ओपी ने कहा, 32-बिट में रूपांतरण कोई फर्क नहीं पड़ता है। तो स्पष्ट रूप से यह बड़े पूर्णांक मूल्यों के लिए भी काम करेगा। – bfavaretto

0

यदि आपकी संख्या हमेशा 32 बिट int में अच्छी तरह से परिवर्तित हो जाती है, तो ऐसा लगता है कि बिटवाई तेज हो सकता है - मुझे लगता है कि कुछ जावास्क्रिप्ट इंजन इसे हार्डवेयर बिटवाई ऑपरेशंस के लिए जेआईटी कर सकते हैं। मैं यह परीक्षण करने के लिए एक jsperf का निर्माण किया है:

http://jsperf.com/evenness

मैं फ़ायरफ़ॉक्स 20 पर बहुत अलग-अलग परिणाम मिलता है, कभी कभी बिटवाइस थोड़ा तेज, कभी कभी कई बार तेज है।

यदि आपकी संख्या 32 बिट चींटियों में अच्छी तरह से परिवर्तित हो सकती है या नहीं, तो मॉड्यूलो के साथ चिपके रहें।

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