Crystal में बाइनरी लेवल पर Int के साथ काम करने के लिए बिटवाइज़ ऑपरेटर हैं।
Crystal में बिट को बाईं ओर (<<) या दाईं ओर (>>) खिसकाने के लिए शिफ्ट ऑपरेटर हैं।
<<)शिफ्ट लेफ्ट ऑपरेटर (<<) बिट को बाईं ओर खिसकाता है।
जिस वैल्यू को खिसकाना है वह बाईं ओर दी जाती है और खिसकाने वाले स्थानों की संख्या दाईं ओर।
0b0010 << 1
# => 0b0100
0b0010 << 2
# => 0b1000
अगर संख्या ऋणात्मक है, तो यह दाईं ओर खिसक जाएगी।
0b0010 << -1
# => 0b0001
>>)शिफ्ट राइट ऑपरेटर (>>) बिट को दाईं ओर खिसकाता है।
शिफ्ट लेफ्ट ऑपरेटर की तरह, जिस वैल्यू को खिसकाना है वह बाईं ओर दी जाती है और खिसकाने वाले स्थानों की संख्या दाईं ओर।
0b0100 >> 1
# => 0b0010
0b0100 >> 2
# => 0b0001
और इसी तरह, अगर संख्या ऋणात्मक है तो यह ऑपरेटर बाईं ओर खिसकेगा।
0b0100 >> -1
# => 0b1000
Crystal में बिटवाइज़ ऑपरेशन करने के लिए 3 बाइनरी ऑपरेटर (&, |, ^) और एक ~ ऑपरेटर है।
&)बाइनरी AND ऑपरेटर (&) दो वैल्यू पर बिटवाइज़ AND करता है।
यह पहली वैल्यू के हर बिट की तुलना दूसरी वैल्यू में उसी स्थान पर मौजूद बिट से करता है।
अगर दोनों बिट 1 हैं, तो परिणामी बिट 1 होता है।
वरना यह 0 होता है।
0b0011 & 0b1010
# => 0b0010
|)बाइनरी OR ऑपरेटर (|) दो वैल्यू पर बिटवाइज़ OR करता है।
यह भी पहली वैल्यू के हर बिट की तुलना दूसरी वैल्यू में उसी स्थान पर मौजूद बिट से करता है।
अगर इनमें से कोई एक बिट 1 है, तो परिणामी बिट 1 होता है।
वरना यह 0 होता है।
0b0011 | 0b1010
# => 0b1011
^)बाइनरी XOR ऑपरेटर (^) बिटवाइज़ XOR करता है।
बिटवाइज़ AND और बिटवाइज़ OR ऑपरेटर की तरह, यह पहली वैल्यू के हर बिट की तुलना दूसरी वैल्यू में उसी स्थान पर मौजूद बिट से करता है।
अगर इनमें से सिर्फ एक 1 है, तो परिणामी बिट 1 होता है।
वरना यह 0 होता है।
0b0011 ^ 0b1010
# => 0b1001
~)अंत में, बिटवाइज़ NOT ऑपरेटर (~) वैल्यू के हर बिट को उलट देता है।
बाकी बाइनरी ऑपरेटरों के उलट, यह एक यूनरी ऑपरेटर है, जो सिर्फ दाईं ओर की वैल्यू पर काम करता है।
~0b1110_0010
# => 0b0001_1101
अभी-अभी आपके मित्र ने आपको एक ज़रूरी राज़ वाला संदेश भेजा है। वे नहीं चाहते थे कि दूसरे इसे आसानी से पढ़ लें, इसलिए संदेश को बिट मैनिपुलेशन के एक सिलसिले से एन्क्रिप्ट किया गया है। संदेश को डिक्रिप्ट करने में मदद के लिए आपको एक प्रोग्राम लिखना होगा।
संदेश को डिक्रिप्ट करने का पहला कदम यह है कि एन्क्रिप्शन के दौरान किए गए शिफ्ट को उलट दिया जाए, यानी बिट्स को वापस बाईं ओर शिफ्ट किया जाए। कितने स्थानों तक शिफ्ट करना है, यह हर संदेश में अलग हो सकता है।
मेथड Secrets.shift_back लागू कीजिए जो एक वैल्यू और बाईं ओर शिफ्ट करने के स्थानों की संख्या लेता है।
Secrets.shift_back(0b0001, 2)
# => 0b0100
अगला कदम है कुछ बिट्स की वैल्यू निकालने के लिए बिट मास्क लगाना। मास्क लगाने के लिए वैल्यू और मास्क के बीच बिटवाइज़ AND किया जाता है।
मेथड Secrets.apply_mask लागू कीजिए जो एक वैल्यू लेता है और उस पर एक मास्क लगाता है।
Secrets.apply_mask(0b0110, 0b0101)
# => 0b0100
बिट्स को बाईं ओर शिफ्ट करने से कुछ नए 0 बिट्स जुड़ गए हैं। इनमें से कुछ नए बिट्स को 1 पर सेट करना है। बिटवाइज़ OR कुछ बिट्स को 1 पर सेट करने और बाकी को वैसा ही बनाए रखने के लिए उपयोगी है।
मेथड Secrets.set_bits लागू कीजिए जो दो वैल्यू लेता है और उन पर बिटवाइज़ OR करता है।
Secrets.set_bits(0b0110, 0b0101)
# => 0b111
एन्क्रिप्शन प्रक्रिया का एक हिस्सा एक तय वैल्यू के साथ XOR लगाता है। मूल वैल्यू तक पहुँचने के लिए एन्क्रिप्ट की गई वैल्यू पर दोबारा उसी तय वैल्यू के साथ XOR कर देना ही काफी है। लेकिन एक गलतफहमी के कारण आपके मित्र ने XOR लगाने से पहले तय वैल्यू के बिट्स पलट दिए थे (यानी तय वैल्यू पर बिटवाइज़ NOT लगा दिया था)।
मेथड Secrets.reverse_xor लागू कीजिए जो एन्क्रिप्ट की गई वैल्यू और तय वैल्यू लेता है और मूल वैल्यू निकालता है।
Secrets.reverse_xor(0b1100, 0b0101)
# => 0b(0110)
Exercism पर साइन अप कीजिए और Crystal को 26 कॉन्सेप्ट142 अभ्यास तथा असली इंसानों से मिलने वाली मेंटरिंग के साथ सीखिए और उसमें महारत हासिल कीजिए, वह भी बिल्कुल मुफ्त।