2015-02-10 11 views
16

हाल ही में मैं golang विनिर्देश पढ़ सकते हैं और कुछ दिलचस्प ऑपरेटरों के साथ सामना करना पड़ा:कुछ ऑपरेटरों "|", "^", "और", "और ^" के बीच अंतर। Golang

& bitwise AND   integers 
| bitwise OR    integers 
^ bitwise XOR   integers 
&^ bit clear (AND NOT) integers 

मैं इसके साथ खेलने के लिए की कोशिश की है, लेकिन केवल एक मैं समझ गया है कि "|" पूर्णांक और "+" ऑपरेटर को अतिरिक्त रूप से फ्लोट्स, स्ट्रिंग इत्यादि के साथ काम करें

अभ्यास में उनके लिए क्या उपयोग किया जाता है? क्या कोई उपरोक्त इन 4 ऑपरेटरों के बारे में कुछ स्पष्टीकरण दे सकता है?

+2

बाइनरी प्रतिनिधित्व और कंप्यूटिंग की नींव की बुनियादी समझ प्राप्त करने के लिए पेटज़ोल्ड के "कोड" जैसी पुस्तक प्राप्त करें। –

उत्तर

30

बिटवेयर ऑपरेटर खेलते हैं जब आपको बाइट- या बिट-स्तरीय डेटा के साथ काम करना होता है।

यहाँ मैं कोड नमूने के साथ बिट आपरेशन के उपयोग के उदाहरण के एक मुट्ठी भर (किसी विशेष क्रम में) की सूची:


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 पर क्लिक करें, कई अच्छे लेख हैं।

+0

धन्यवाद! वास्तव में अच्छा जवाब। क्या आप पुस्तक का सुझाव दे सकते हैं, जो मेरे जैसे नौसिखिया के लिए "निम्न स्तर" प्रोग्रामिंग की कुछ मूल बातें बताते हैं? (बहुत तकनीकी और गणितीय शर्तों में गहराई के बिना) –

+1

@TimurFayzrakhmanov बस इसे Google (शब्द _ "bitwise ऑपरेटरों ट्यूटोरियल" _) शब्द, इंटरनेट पर कई अच्छे ट्यूटोरियल हैं। अधिकांश भाषा विशिष्ट हैं लेकिन कम से कम वे सभी प्रोग्रामिंग भाषाओं पर लागू होते हैं। यहां 1 मिनट की गुगलिंग में एक अच्छा पाया गया है: [बिटवाई ऑपरेटरों को समझना] (http://code.tutsplus.com/articles/understanding-bitwise-operators--active-11301)। विकिपीडिया लेख भी पढ़ें: [बिटवाई ऑपरेशन] (http://en.wikipedia.org/wiki/Bitwise_operation) – icza

+0

इसे मिला! धन्यवाद फिर से!) –

13
क्या वे तकनीकी रूप से इस

package main 

import "fmt" 

func main() { 
    // Use bitwise OR | to get the bits that are in 1 OR 2 
    // 1  = 00000001 
    // 2  = 00000010 
    // 1 | 2 = 00000011 = 3 
    fmt.Println(1 | 2) 

    // Use bitwise OR | to get the bits that are in 1 OR 5 
    // 1  = 00000001 
    // 5  = 00000101 
    // 1 | 5 = 00000101 = 5 
    fmt.Println(1 | 5) 

    // Use bitwise XOR^to get the bits that are in 3 OR 6 BUT NOT BOTH 
    // 3  = 00000011 
    // 6  = 00000110 
    // 3^6 = 00000101 = 5 
    fmt.Println(3^6) 

    // Use bitwise AND & to get the bits that are in 3 AND 6 
    // 3  = 00000011 
    // 6  = 00000110 
    // 3 & 6 = 00000010 = 2 
    fmt.Println(3 & 6) 

    // Use bit clear AND NOT &^ to get the bits that are in 3 AND NOT 6 (order matters) 
    // 3  = 00000011 
    // 6  = 00000110 
    // 3 &^ 6 = 00000001 = 1 
    fmt.Println(3 &^ 6) 
} 

View it on the playground

में टिप्पणी की जाँच करते हैं कृपया ध्यान दें कि मैं कि यह वास्तव में 1 + 5 की तरह इसके अलावा नहीं है दिखाने के लिए | के दो उदाहरण दिया के लिए

व्यावहारिक उपयोगों के लिए मुझे यकीन है कि कुछ अन्य उदाहरणों के साथ टिप्पणी कर सकते हैं लेकिन एक आम उपयोग एक अनुमति प्रणाली की तरह कुछ के लिए झंडे का एक बिटमास्क बनाना है।

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