बिटवेयर ऑपरेटर खेलते हैं जब आपको बाइट- या बिट-स्तरीय डेटा के साथ काम करना होता है।
यहाँ मैं कोड नमूने के साथ बिट आपरेशन के उपयोग के उदाहरण के एक मुट्ठी भर (किसी विशेष क्रम में) की सूची:
1. वे आम और क्रिप्टोग्राफी और हैश में कई एल्गोरिदम का हिस्सा हैं कार्य (उदाहरण के लिए MD5)।
2. उन्होंने यह भी अक्सर अगर आप और अंतरिक्ष "बचाने" करना चाहते हैं आप पैक एकाधिक "bool" चर उदाहरण के लिए एक int
में, आप प्रत्येक bool चर करने के लिए एक सा आवंटित किया जाता है। बिट्स ऑपरेटरों का अलग-अलग परिवर्तन/बिट्स को पढ़ने में सक्षम होने के लिए आपको उपयोग करना होगा।
उदाहरण 8 बिट/bools पैकिंग के लिए एक में int
:
flags := 0x00 // All flags are 0
flags |= 0x02 // Turn the 2nd bit to 1 (leaving rest unchanged)
flags |= 0xff // Turn 8 bits (0..7) to 1
flags &= 0xfe // Set the lowest bit to 0 (leaving rest unchanged)
istrue := flags&0x04 != 0 // Test if 3rd bit is 1
3. एक अन्य क्षेत्र है डेटा जहाँ आप एक byte
का सबसे बाहर निकलना और करने के लिए अपने सभी बिट्स का उपयोग करना चाहते संपीड़ित है कुछ जानकारी स्टोर/पुनः प्राप्त करें (कंप्यूटिंग और डिजिटल संचार में जानकारी की मूल इकाई थोड़ा सा है)।
4. संपीड़न की तरह, लेकिन एक ही काफी नहीं: बिटस्ट्रीम। इसका उपयोग पूर्ण बाइट्स न भेजकर डेटा स्ट्रीम में स्थान बचाने के लिए भी किया जाता है, बल्कि खेतों में मनमानी बिट-लम्बाई होती है।
मैंने एक अत्यधिक अनुकूलित बिट-स्तरीय रीडर और राइटर पैकेज लिखा है और प्रकाशित किया है, यहां खुलासा किया गया है: github.com/icza/bitio। आप अपने स्रोतों में सभी प्रकार के बिट ऑपरेशंस का व्यापक उपयोग देखेंगे।
5. एक और व्यावहारिक उपयोग: (पूर्णांक) संख्या की परीक्षण कुछ गुण। पूर्णांक संख्याओं (Two's complement) के द्विआधारी प्रतिनिधित्व को जानना उनके बाइनरी प्रतिनिधित्व में संख्याओं की कुछ विशेषताओं हैं। उदाहरण के एक पूर्णांक संख्या (2 के पूरक में) के लिए है भी (2 से विभाजित किया जा सकता है) सबसे कम बिट 0 है अगर:
func isEven(i int) bool {
return i&0x01 == 0
}
एक पूर्णांक के टुकड़े का परीक्षण कर आप भी अगर यह एक शक्ति है बता सकते हैं तक 2. उदाहरण के लिए यदि एक सकारात्मक संख्या में केवल एक 1
बिट है, तो यह 2 की शक्ति है (उदाहरण के लिए2 = 0x02 = 00000010b
, 16 = 0x10 = 00010000
लेकिन उदाहरण के लिए 17 = 0x11 = 00010001
2 की शक्ति नहीं है)।
6.कई एन्कोडिंग/डिकोडिंग प्रक्रियाएं भी बिट ऑपरेशंस का उपयोग करती हैं। सबसे छोटा है UTF-8 encoding जो बाइट अनुक्रमों के रूप में यूनिकोड कोड पॉइंट्स (rune
गो) का प्रतिनिधित्व करने के लिए चर-लंबाई एन्कोडिंग का उपयोग करता है।
एक चर-लंबाई एन्कोडिंग का एक साधारण भिन्नता एक बाइट (8 वें या 7 वें अगर 0-अनुक्रमित) के उच्चतम बिट का उपयोग करने के लिए सिग्नल करने के लिए किया जा सकता है यदि अधिक बाइट्स को किसी संख्या को डीकोड करने की आवश्यकता होती है, और शेष 7 बिट हमेशा होते हैं "उपयोगी" डेटा। आप इस तरह उच्चतम बिट "अलग" 7 उपयोगी बिट्स का परीक्षण करने और कर सकते हैं:
b := readOneByte()
usefulBits := b & 0x7f
hasMoreBytes := b & 0x80 != 0
इस तरह के एक चर लंबाई एन्कोडिंग का उपयोग करने का लाभ यह है कि आप जाओ जो स्मृति में 8 बाइट्स में uint64
प्रकार का उपयोग करें, भले ही , छोटी संख्याओं को कम बाइट्स का उपयोग करके अभी भी प्रदर्शित किया जा सकता है (0..127
में संख्या केवल 1 बाइट की आवश्यकता है!)। यदि आप जिन नमूने को स्टोर या ट्रांसफर करना चाहते हैं, उनमें बहुत कम मूल्य हैं, तो यह अकेले डेटा को 1/8 वें = 12.5% तक संपीड़ित कर सकता है। नीचे की ओर यह है कि बड़ी संख्या (जिसमें उच्चतम बाइट में भी बिट्स हैं) 8 बाइट से अधिक का उपयोग करेंगे। चाहे यह लायक है नमूने के सिद्धांत पर निर्भर करता है।
एक्सऔर सूची पर चला जाता है ...
आप जानते हुए भी/जाओ में (और कई अन्य प्रोग्रामिंग भाषाओं में) बिटवाइज़ ऑपरेटर्स का उपयोग कर के बिना रह सकते हैं? इसका जवाब है हाँ। लेकिन यदि आप उन्हें जानते हैं, तो कभी-कभी वे आपके जीवन को आसान बना सकते हैं और आपके कार्यक्रम अधिक कुशल हो सकते हैं।
यदि आप इस विषय पर अधिक जानना चाहते हैं, तो विकिपीडिया आलेख पढ़ें: Bitwise operation और "बिटवाई ऑपरेटर्स ट्यूटोरियल" शब्द को Google पर क्लिक करें, कई अच्छे लेख हैं।
बाइनरी प्रतिनिधित्व और कंप्यूटिंग की नींव की बुनियादी समझ प्राप्त करने के लिए पेटज़ोल्ड के "कोड" जैसी पुस्तक प्राप्त करें। –