चूँकि किसी ने इस विषय पर ध्यान नहीं दिया कि ये उपयोगी क्यों हैं:
झंडे के साथ काम करते समय मैं बिटवाइज़ ऑपरेशंस का बहुत उपयोग करता हूं। उदाहरण के लिए, यदि आप किसी ऑपरेशन में झंडे की एक श्रृंखला को पास करना चाहते हैं (कहते हैं, File.Open()
रीड मोड और राइट मोड दोनों सक्षम करें) के साथ, आप उन्हें एकल मान के रूप में पारित कर सकते हैं। यह एक बिटसेट (बाइट, शॉर्ट, इंट, या लॉन्ग) में प्रत्येक बिट के लिए संभव है, यह बताकर पूरा किया गया है। उदाहरण के लिए:
Read: 00000001
Write: 00000010
इसलिए यदि आप पढ़ना और लिखना चाहते हैं, तो आप (READ | WRITE) पास करेंगे और फिर दोनों को मिला देंगे
00000011
जिसे फिर दूसरे छोर पर डिक्रिप्ट किया जा सकता है जैसे:
if ((flag & Read) != 0) { //...
जो जांचता है
00000011 &
00000001
जो लौटता है
00000001
जो 0 नहीं है, इसलिए ध्वज READ को निर्दिष्ट करता है।
आप विभिन्न बिट्स को टॉगल करने के लिए XOR का उपयोग कर सकते हैं। दिशात्मक इनपुट (ऊपर, नीचे, बाएँ, दाएँ) निर्दिष्ट करने के लिए एक ध्वज का उपयोग करते समय मैंने इसका उपयोग किया है। उदाहरण के लिए, यदि कोई स्प्राइट क्षैतिज रूप से आगे बढ़ रहा है, और मैं चाहता हूं कि यह चारों ओर घूमे:
Up: 00000001
Down: 00000010
Left: 00000100
Right: 00001000
Current: 00000100
मैं बस (LEFT | RIGHT) के साथ वर्तमान मूल्य को XOR करता हूं, जो इस मामले में LEFT को बंद कर देगा और RIGHT चालू कर देगा।
बिट शिफ्टिंग कई मामलों में उपयोगी है।
x << y
के समान है
x * 2 y
यदि आपको जल्दी से दो की शक्ति से गुणा करने की आवश्यकता है, लेकिन 1-बिट को शीर्ष बिट में शिफ्ट करने के लिए देखें - यह संख्या को नकारात्मक बनाता है जब तक कि यह अहस्ताक्षरित न हो। यह विभिन्न आकारों के डेटा से निपटने के दौरान भी उपयोगी है। उदाहरण के लिए, चार बाइट्स से पूर्णांक पढ़ना:
int val = (A << 24) | (B << 16) | (C << 8) | D;
यह मानते हुए कि A सबसे महत्वपूर्ण बाइट है और D सबसे कम है। यह समाप्त होगा:
A = 01000000
B = 00000101
C = 00101011
D = 11100011
val = 01000000 00000101 00101011 11100011
रंगों को अक्सर इस तरह से संग्रहीत किया जाता है (सबसे महत्वपूर्ण बाइट के साथ या तो अनदेखा किया जाता है या अल्फा के रूप में उपयोग किया जाता है):
A = 255 = 11111111
R = 21 = 00010101
G = 255 = 11111111
B = 0 = 00000000
Color = 11111111 00010101 11111111 00000000
मानों को फिर से खोजने के लिए, बिट्स को दाईं ओर तब तक शिफ्ट करें, जब तक कि यह बचे हुए उच्च-क्रम बिट्स से नकाब न हटा दे:
Int Alpha = Color >> 24
Int Red = Color >> 16 & 0xFF
Int Green = Color >> 8 & 0xFF
Int Blue = Color & 0xFF
0xFF
के रूप में ही है 11111111
। तो अनिवार्य रूप से, लाल के लिए, आप यह कर रहे होंगे:
Color >> 16 = (filled in 00000000 00000000)11111111 00010101 (removed 11111111 00000000)
00000000 00000000 11111111 00010101 &
00000000 00000000 00000000 11111111 =
00000000 00000000 00000000 00010101 (The original value)