2012-05-08 16 views
86

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

+0

क्या आप बिटवाई ऑपरेटरों जैसे & &^आदि और सामान्य रूप से बूलियन तर्क? मुखौटा संचालन के किसी भी स्पष्टीकरण के लिए इसकी आवश्यकता होगी। –

+0

हाँ मैं एक बिटवाइज़ ऑपरेटर्स की समझ में है, और बूलियन तर्क –

+1

मैं जानता हूँ कि लिंक पोस्ट नहीं किया जाना चाहिए, लेकिन विकिपीडिया स्पष्टीकरण महान है: https://en.wikipedia.org/wiki/Mask_(computing) – pevik

उत्तर

126

एक मुखौटा परिभाषित करता है कि आप कौन सी बिट रखना चाहते हैं, और आप किन बिट्स को साफ़ करना चाहते हैं।

मास्किंग एक मूल्य के लिए मुखौटा लगाने का कार्य है।

  • बिटवाइस Anding आदेश
  • बिटवाइस Oring में मूल्य में बिट्स के एक सबसेट को निकालने के लिए आदेश में
  • बिटवाइस XORing मूल्य में बिट्स के एक सबसेट सेट करने के लिए: यह क्या कर रही द्वारा पूरा किया है

    Mask: 00001111b 
    Value: 01010101b 
    
    : मूल्य

नीचे में बिट्स के एक सबसेट टॉगल करने के लिए मूल्य में बिट्स के एक सबसेट निकालने का एक उदाहरण है

मास्क को मूल्य पर लागू करने का अर्थ है कि हम पहले (उच्च) 4 बिट्स को साफ़ करना चाहते हैं, और अंतिम (निचले) 4 बिट्स को रखना चाहते हैं। इस प्रकार हमने निचले 4 बिट निकाले हैं। परिणाम है:

Mask: 00001111b 
Value: 01010101b 
Result: 00000101b 

मास्किंग, का उपयोग कर कार्यान्वित किया जाता है और इसलिए सी में हम पाते हैं: एक बड़ा शब्द से अलग-अलग बाइट्स निकाला जा रहा है:

uint8_t stuff(...) { 
    uint8_t mask = 0x0f; // 00001111b 
    uint8_t value = 0x55; // 01010101b 
    return mask & value; 
} 

यहाँ एक बहुत ही आम यूज-केस है। हम पहले बाइट के रूप में शब्द में उच्च-आदेश बिट्स को परिभाषित करते हैं। हम इसके लिए दो ऑपरेटरों का उपयोग करते हैं, &, और >> (दाएं दाएं)। इस तरह हम एक 32-बिट पूर्णांक से चार बाइट्स निकाल सकते हैं है:

void more_stuff(uint32_t value) {    // Example value: 0x01020304 
    uint32_t byte1 = (value >> 24);   // 0x01020304 >> 24 is 0x01 so 
               // no masking is necessary 
    uint32_t byte2 = (value >> 16) & 0xff; // 0x01020304 >> 16 is 0x0102 so 
               // we must mask to get 0x02 
    uint32_t byte3 = (value >> 8) & 0xff; // 0x01020304 >> 8 is 0x010203 so 
               // we must mask to get 0x03 
    uint32_t byte4 = value & 0xff;   // here we only mask, no shifting 
               // is necessary 
    ... 
} 

सूचना है कि आप उपरोक्त ऑपरेटर का क्रम बदलने सकता है, तो आपको पहले मुखौटा, फिर shift कर सकता है। परिणाम एक ही हैं, लेकिन अब आपको एक अलग मुखौटा का उपयोग करना होगा:

uint32_t byte3 = (value & 0xff00) >> 8; 
+0

अच्छा जवाब लेकिन मास्किंग कर सकते हैं ओआर या एक्सओआर ऑपरेशंस और उपयुक्त मास्क के साथ * सेटिंग * या * टॉगलिंग * विशिष्ट बिट्स के लिए भी लागू किया जाए। –

+0

@ user239558 उदाहरण और उचित वाक्यविन्यास के लिए धन्यवाद। @ पॉल आर। क्या मैं बस उपयोगकर्ता 239558 –

+0

@ श्री जेड द्वारा प्रदान किए गए उदाहरण में मुखौटा और मूल्य कहूंगा: सी, सी ++ और संबंधित भाषाओं में आप ** bitwise और ** ऑपरेटर, जिसे '&' के रूप में लिखा गया है। –

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