"हाय, अमीगो!"

"मैं बिटमास्क और एक्सओआर के बारे में भी बात करना चाहूंगा।"

"आप पहले से ही जानते हैं कि संख्याओं में बिट्स होते हैं और आप इन बिट्स पर विभिन्न ऑपरेशन कर सकते हैं। एक बिटमास्क एक पूर्णांक के रूप में कई अलग-अलग तार्किक मूल्यों (सही/गलत मान) का प्रतिनिधित्व करता है। इस मामले में, प्रत्येक बूलियन-वैल्यू से मेल खाता है। एक विशिष्ट बिट। यहां बताया गया है कि यह कैसे किया जा सकता है:"

"दो (1, 2, 4, 8, 16, 32, ...) की शक्तियों के द्विआधारी प्रतिनिधित्व में केवल एक बिट सेट करना शामिल है:"

संख्या बाइनरी प्रतिनिधित्व
1 0000 0001
2 0000 0010
4 0000 0100
8 0000 1000
16 0001 0000
19 (दो की शक्ति नहीं) 0001 0011
31 (दो की शक्ति नहीं) 0001 1111

"तो, किसी भी पूर्णांक को बिट्स की सरणी या बूलियन मानों की सरणी के रूप में माना जा सकता है।"

"यहां बताया गया है कि आप विभिन्न बूलियन मानों को एक संख्या में कैसे संग्रहीत कर सकते हैं:"

बूलियन मान
boolean a = true;
boolean b = false;
boolean c = true;
boolean d = false;
मान एक संख्या में पैक किए गए:
int result = 0;
 if (a) result += 1; // 1 == 20 — bit 0
 if (b) result += 2; // 2 == 21 — bit 1
 if (c) result += 4; // 4 == 22 — bit 2
 if (d) result += 8; // 8 == 23 — bit 3

"अब प्रत्येक बिट 1 है यदि संबंधित बूलियन चर सत्य था।"

हमारे मामले में, चर a और c सही थे, इसलिए परिणाम 1+4 == 5 के बराबर है

0000 0101
0000 dcba

"मुझे लगता है कि मुझे पता है कि क्या हो रहा है।"

"ठीक है, अगर आप समझते हैं, तो चलिए आगे बढ़ते हैं।"

"एक int में 32 बिट्स होते हैं। उनमें से एक का उपयोग संख्या के संकेत के लिए किया जाता है, और अन्य 31 का उपयोग 31 बूलियन चर के मानों को संग्रहीत करने के लिए किया जा सकता है।"

"एक लंबे समय में 64 बिट्स होते हैं जहां हम 63 बूलियन चर स्टोर कर सकते हैं।"

"हां।"

"दर्जनों चर एक संख्या में सिमट गए। यह काफी कुछ है।"

"लेकिन यह कहाँ लागू होता है?"

"मुख्य रूप से ऐसी स्थितियों में जहां आपको वस्तुओं के बारे में बहुत सारी जानकारी संग्रहीत करने की आवश्यकता होती है। जब आप किसी वस्तु के बारे में बहुत सारी जानकारी संग्रहीत करते हैं, तो हमेशा कुछ दर्जन बूलियन चर होते हैं।" इस दृष्टिकोण के साथ, वे सभी आसानी से एक संख्या में संग्रहीत होते हैं। "

"'संग्रहीत' शब्द पर जोर देने के साथ। क्योंकि वास्तव में संख्या का उपयोग करना इतना सुविधाजनक नहीं है।"

"वैसे, मैं बस यही पूछना चाहता था। हम संख्या से बूलियन मान कैसे निकालते हैं?"

"यह बिल्कुल भी जटिल नहीं है। मान लीजिए कि आपको यह निर्धारित करने की आवश्यकता है कि क्या बिट 6 को 1 पर सेट किया गया है (2 से पांच की शक्ति 32 है)। हम इस तरह से जांच कर सकते हैं:"

संख्याओं को एक में मिलाएं:
int a = 32; // 25 == 0010 0000
int b = 8; // 23 == 0000 1000
int c = 2; // 21 == 0000 0010

int result = a + b + c; // 32 + 8 + 2 == 42 == 0010 1010
विशिष्ट बिट्स की जाँच करके मान निकालें:
int a = result & 32; // 0010 1010 & 0010 0000 = 0010 0000
int b = result & 8; // 0010 1010 & 0000 1000 = 0000 1000
int c = result & 2; // 0010 1010 & 0000 0010 = 0000 0010

"इस प्रकार, बिटमास्क के साथ काम करने में तीन ऑपरेशन शामिल हैं:"

1)  एक विशिष्ट बिट को 0 पर सेट करें

2)  एक विशिष्ट बिट को 1 पर सेट करें

3)  विशिष्ट बिट के मान की जाँच करें।

"उदाहरण के लिए बिट 6 लें।"

"आप बिट 6 से 1 कैसे सेट करते हैं?"

कोड विवरण
result = result | 01000000;
result |= 01000000;
आप बिट 6 से 1 कैसे सेट करते हैं?
result = result & 10111111;
result &= 10111111;
आप बिट 6 से 0 कैसे सेट करते हैं?
c = result & 01000000;
आप बिट 6 का मान कैसे प्राप्त करते हैं?

"यह बेहद असामान्य है, लेकिन मुश्किल नहीं है। यार, अब मैं एक हॉट-शॉट प्रोग्रामर हूं।"

"और 0 या 1: 01000000 या 10111111 पर एक विशिष्ट बिट सेट के साथ आसानी से नंबर कैसे प्राप्त करें, इस पर एक और छोटी टिप।"

इसके लिए हमारे पास  >> और  << ऑपरेटर हैं।

"1 शून्य शक्ति के लिए 2 है। दूसरे शब्दों में, बिट 0 के साथ एक संख्या 1 पर सेट है। हमें बिट 6 सेट के साथ एक संख्या की आवश्यकता है।"

int c = 1 << 6; // 0000 0001 << 6 == 0100 0000 == 64

"अच्छा! यह ऐसे मामलों के लिए वास्तव में मददगार है।"

"लेकिन क्या होगा अगर मुझे एक संख्या की आवश्यकता है जहां प्रत्येक बिट 1 पर सेट हो, सिवाय एक विशिष्ट बिट के 0 पर सेट हो?"

"यह भी मुश्किल नहीं है:"

int d = ~(1 << 6); // ~0100 0000 == 10111111

"दूसरे शब्दों में, यह सब बहुत आसान है:"

कोड विवरण
result = result | (1 << 6);
result |= (1 << 6);
आप बिट 6 से 1 कैसे सेट करते हैं?
result = result & ~(1 << 6);
result &= ~(1 << 6);
आप बिट 6 से 0 कैसे सेट करते हैं?
c = result & (1 << 6);
आप बिट 6 का मान कैसे प्राप्त करते हैं?

"यह बहुत मुश्किल नहीं लग रहा है। लेकिन मैं इसे तुरंत याद नहीं रखूंगा।"

"लेकिन, अगर आपको किसी और के कोड में" परिणाम और = ~ (1 << 6) "जैसी डरावनी अभिव्यक्ति मिलती है, तो आपको पता चल जाएगा कि यह कोई बिटमास्क के साथ काम कर रहा है।"

"और यदि आप इसे अक्सर सामना करते हैं, तो यह आपके लिए खुद को याद रखेगा।"

"स्वयं को याद रखें... यह अच्छा लगता है। पाठ के लिए धन्यवाद।"