2011-07-02 11 views
6

विकिपीडिया, ज्ञान में से एक सत्य स्रोत, राज्यों:क्या बिटवाई ऑपरेशंस अभी भी व्यावहारिक हैं?

सबसे बड़े माइक्रोप्रोसेसरों पर, बिटवाइज़ संचालन थोड़ा तेज जोड़ और घटाव के संचालन और आम तौर पर गुणा और भाग संचालन की तुलना में काफी तेजी से कर रहे हैं। आधुनिक आर्किटेक्चर पर, यह मामला नहीं है: bitwise ऑपरेशंस आम तौर पर समान गति के समान होते हैं (हालांकि गुणा के मुकाबले अभी भी तेज )।

क्या बिटवाई ऑपरेशन हैक सीखने का कोई व्यावहारिक कारण है या अब यह सिद्धांत और जिज्ञासा के लिए कुछ सीखना है?

+1

विकिपीडिया "ज्ञान का सही स्रोत"? यह थोड़ा सा उत्साहित लगता है ... – ShinTakezou

+11

@ShinTakezou: इसे कटाक्ष कहा जाता है। – geekosaur

+1

मुझे इस तथ्य के अलावा सुराग नहीं मिल सकता है कि मुझे लगता है कि दावा अतिरंजित है, और जब से मुझे लगता है कि विकिपीडिया वास्तव में ज्ञान का एक महान महान स्रोत है और यह हमेशा सही है, और जब से मैं नहीं करता इसके बारे में ओपी की असली राय और पीओवी नहीं है, मुझे दावे को गंभीरता से लेना है। यह जानकर खुशी हुई कि यह कटाक्ष है। – ShinTakezou

उत्तर

12

बिटवाई ऑपरेशंस अध्ययन के लायक हैं क्योंकि उनके पास कई अनुप्रयोग हैं। यह अंकगणितीय परिचालनों को प्रतिस्थापित करने के लिए उनके मुख्य उपयोग नहीं है। क्रिप्टोग्राफी, कंप्यूटर ग्राफिक्स, हैश फ़ंक्शंस, संपीड़न एल्गोरिदम, और नेटवर्क प्रोटोकॉल केवल कुछ उदाहरण हैं जहां बिटवाई ऑपरेशंस बेहद उपयोगी हैं।

विकिपीडिया आलेख से उद्धृत पंक्तियों ने बस गति बिटवाई संचालन के बारे में कुछ संकेत देने की कोशिश की। दुर्भाग्य से लेख अनुप्रयोगों के कुछ अच्छे उदाहरण प्रदान करने में विफल रहता है।

4

वे समझने के लिए उपयोगी हैं कि कैसे बाइनरी "काम करता है"; अन्यथा, नहीं। असल में, मैं कहूंगा कि अगर किसी दिए गए आर्किटेक्चर पर बिटवाईक हैक तेजी से हैं, तो यह उस तथ्य का उपयोग करने के लिए कंपाइलर का काम है - आपका नहीं। लिखें कि आपका क्या मतलब है।

+0

+1 "यह कंपाइलर का काम है।" उस ने कहा, कभी-कभी आपका मतलब क्या है एक साथ बिट मास्क का एक समूह, फिर और परिणाम के साथ परिणाम यह देखने के लिए कि विभिन्न झंडे सेट हैं या नहीं। –

+0

@ शेरम: निश्चित रूप से - लेकिन फिर आप "मतलब" जोड़ या घटाव नहीं करते हैं, इसलिए बिटवाई ऑपरेशंस अर्थात् सही हैं (और फिर, यह करने के लिए सबसे अच्छा तरीका जानने के लिए यह संकलक का काम है)। प्लेटफ़ॉर्म और भाषा के आधार पर – geekosaur

+1

कोड हमेशा संकलित नहीं किया जाता है, इसलिए यदि प्रदर्शन अभी भी चिंता का विषय है, तो – ricosrealm

1

बेशक (मेरे लिए) जवाब हाँ है। तथ्य यह है कि आजकल add निर्देश or या and जितना तेज़ है इसका मतलब है कि ... लेकिन oradd नहीं है और जब भी आपको आवश्यकता हो, तो आप इसका उपयोग करेंगे (कोर्स के योग के लिए नहीं बल्कि केवल or करने के लिए , ...)। एड, डिवीजन आदि जैसे निर्देशों की गति में सुधार का मतलब है कि अब आप उनका उपयोग कर सकते हैं और प्रदर्शन प्रभाव के बारे में कम चिंतित हैं, लेकिन यह अतीत में सच है कि आप एक add को कई बिटवाइज़ में नहीं बदलेंगे संचालन!

1

एकमात्र ऐसा मामला जहां उनका उपयोग करने का अर्थ होता है, यदि आप वास्तव में बिटवेक्टर के रूप में अपनी संख्या का उपयोग कर रहे हैं। उदाहरण के लिए, यदि आप किसी प्रकार के हार्डवेयर का मॉडलिंग कर रहे हैं और चर रजिस्ट्रार का प्रतिनिधित्व करते हैं।

यदि आप अंकगणित करना चाहते हैं, तो अंकगणितीय ऑपरेटरों का उपयोग करें।

1

आपकी समस्या क्या है निर्भर करता है। यदि आप हार्डवेयर को नियंत्रित कर रहे हैं तो आपको एक पूर्णांक के भीतर एकल बिट्स सेट करने के तरीकों की आवश्यकता है।

ओजीडी 1 पीसीआई बोर्ड (ओपन ग्राफिक्स कार्ड) खरीदें और libpci का उपयोग करके उससे बात करें। http://en.wikipedia.org/wiki/Open_Graphics_Project

11

बिटवाई ऑपरेशंस अभी भी उपयोगी हैं। उदाहरण के लिए, इन्हें एकल चर का उपयोग करके "झंडे" बनाने के लिए उपयोग किया जा सकता है, और विभिन्न स्थितियों को इंगित करने के लिए उपयोग की जाने वाली चर की संख्या को बचाया जा सकता है। अंकगणितीय परिचालनों पर प्रदर्शन के संबंध में, संकलक को ऑप्टिमाइज़ेशन छोड़ना बेहतर होता है (जब तक कि आप गुरु के कुछ प्रकार न हों)।

+0

यह एक और अच्छा उपयोग है। – ricosrealm

+2

+1 इसे झंडे के रूप में उपयोग करने के लिए +1 – CamelCamelCamel

+0

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

1

यह सच है कि ज्यादातर मामलों में जब आप निरंतर एक पूर्णांक गुणा करते हैं जो दो की शक्ति होती है, तो संकलक बिट-शिफ्ट का उपयोग करने के लिए अनुकूलित करता है। हालांकि, जब शिफ्ट एक चर भी है, तो संकलक इसे घटा नहीं सकता है, जब तक कि आप स्पष्ट रूप से शिफ्ट ऑपरेशन का उपयोग नहीं करते।

+0

सच। दूसरी तरफ कुछ प्रोसेसर तेजी से गुणा करते हैं, इससे वे बिट्स की एक परिवर्तनीय मात्रा में बदलाव कर सकते हैं। बस पठनीय क्या लिखो। संभावना है कि आपके कोड का महत्वपूर्ण 10% कहीं और है ... –

0

आईपीवी 4 पतों के साथ काम करने के लिए अक्सर यह पता लगाने के लिए बिट-ऑपरेशंस की आवश्यकता होती है कि क्या एक सहकर्मी का पता एक रूटेबल नेटवर्क के भीतर है या उसे गेटवे पर अग्रेषित किया जाना चाहिए, या यदि पीयर फ़ायरवॉल नियमों द्वारा अनुमति या अस्वीकार किए गए नेटवर्क का हिस्सा है। नेटवर्क के प्रसारण पते को खोजने के लिए बिट ऑपरेशंस की आवश्यकता होती है।

आईपीवी 6 पते के साथ काम करने के लिए समान मौलिक बिट-स्तरीय संचालन की आवश्यकता होती है, लेकिन क्योंकि वे इतने लंबे हैं, मुझे यकीन नहीं है कि उन्हें कैसे लागू किया जाता है। मैं पैसा दांव दूंगा कि वे अभी भी बिट ऑपरेटरों का उपयोग टुकड़े पर रखे गए हैं, जो आर्किटेक्चर के लिए उचित आकार में हैं।

1

मजेदार कोई भी सी/सी ++ में ctype [] सरणी का उल्लेख करने के लिए फिट नहीं देखा - जावा में भी लागू किया गया। यह अवधारणा भाषा प्रसंस्करण में बेहद उपयोगी है, खासकर जब अलग-अलग अक्षर का उपयोग करते हैं, या जब वाक्य को पार करते हैं।

ctype [] 256 लघु पूर्णांक की एक सरणी है, और प्रत्येक पूर्णांक में, विभिन्न वर्ण प्रकारों का प्रतिनिधित्व करने वाली बिट्स हैं। उदाहरण के लिए, सीटीपी [; ए '] - सीटीपी [' जेड '] में यह दिखाने के लिए सेट बिट्स हैं कि वे वर्णमाला के ऊपरी-केस अक्षर हैं; ctype ['0'] - ctype ['9'] बिट्स दिखाने के लिए सेट हैं कि वे संख्यात्मक हैं। यह देखने के लिए कि कोई वर्ण x अल्फान्यूमेरिक है, तो आप कुछ लिख सकते हैं जैसे 'if (ctype [x] & (यूसी | एलसी | NUM))' जो कुछ हद तक तेज़ और लिखने से ज्यादा सुरुचिपूर्ण है 'अगर (' ए '= x < = 'Z' || .... '

एक बार जब आप थोड़ा सा सोचने लगते हैं, तो आपको इसका उपयोग करने के लिए बहुत सारे स्थान मिलते हैं। उदाहरण के लिए, मेरे पास दो टेक्स्ट बफर थे। मैंने एक दूसरे को लिखा, सभी घटनाओं को बदलना जैसा कि मैंने चलाया था, के साथ FINDSTring के बाद। फिर अगली खोज-प्रतिस्थापन जोड़ी के लिए, मैंने बस बफर इंडेक्स को स्विच किया, इसलिए मैं हमेशा बफर [इन] से बफर [आउट] में लिख रहा था। '' 0 के रूप में शुरू हुआ ',' आउट ' के रूप में 1. एक प्रतिलिपि पूरा करने के बाद मैंने बस '^^1; बाहर^= 1;' लिखा। और सभी प्रतिस्थापनों को संभालने के बाद मैंने बस डिस्क पर बफर [आउट] लिखा, यह जानने की आवश्यकता नहीं कि उस पर 'आउट' क्या था समय

यदि आपको लगता है कि यह निम्न स्तर है, तो मान लें कि कुछ मानसिक त्रुटियां जैसे कि डीजा-वू और इसके जुड़वां जामाइस-वू सेरेब्रल बिट त्रुटियों के कारण होती हैं!

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