रहस्य

रहस्य

सीखने का अभ्यास

परिचय

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 ऑपरेटर (&) दो वैल्यू पर बिटवाइज़ AND करता है। यह पहली वैल्यू के हर बिट की तुलना दूसरी वैल्यू में उसी स्थान पर मौजूद बिट से करता है। अगर दोनों बिट 1 हैं, तो परिणामी बिट 1 होता है। वरना यह 0 होता है।

0b0011 & 0b1010
# => 0b0010

बिटवाइज़ OR (|)

बाइनरी OR ऑपरेटर (|) दो वैल्यू पर बिटवाइज़ OR करता है। यह भी पहली वैल्यू के हर बिट की तुलना दूसरी वैल्यू में उसी स्थान पर मौजूद बिट से करता है। अगर इनमें से कोई एक बिट 1 है, तो परिणामी बिट 1 होता है। वरना यह 0 होता है।

0b0011 | 0b1010
# => 0b1011

बिटवाइज़ XOR (^)

बाइनरी XOR ऑपरेटर (^) बिटवाइज़ XOR करता है। बिटवाइज़ AND और बिटवाइज़ OR ऑपरेटर की तरह, यह पहली वैल्यू के हर बिट की तुलना दूसरी वैल्यू में उसी स्थान पर मौजूद बिट से करता है। अगर इनमें से सिर्फ एक 1 है, तो परिणामी बिट 1 होता है। वरना यह 0 होता है।

0b0011 ^ 0b1010
# => 0b1001

बिटवाइज़ NOT (~)

अंत में, बिटवाइज़ NOT ऑपरेटर (~) वैल्यू के हर बिट को उलट देता है। बाकी बाइनरी ऑपरेटरों के उलट, यह एक यूनरी ऑपरेटर है, जो सिर्फ दाईं ओर की वैल्यू पर काम करता है।

~0b1110_0010
# => 0b0001_1101

निर्देश

अभी-अभी आपके मित्र ने आपको एक ज़रूरी राज़ वाला संदेश भेजा है। वे नहीं चाहते थे कि दूसरे इसे आसानी से पढ़ लें, इसलिए संदेश को बिट मैनिपुलेशन के एक सिलसिले से एन्क्रिप्ट किया गया है। संदेश को डिक्रिप्ट करने में मदद के लिए आपको एक प्रोग्राम लिखना होगा।

1. बिट्स को वापस शिफ्ट कीजिए

संदेश को डिक्रिप्ट करने का पहला कदम यह है कि एन्क्रिप्शन के दौरान किए गए शिफ्ट को उलट दिया जाए, यानी बिट्स को वापस बाईं ओर शिफ्ट किया जाए। कितने स्थानों तक शिफ्ट करना है, यह हर संदेश में अलग हो सकता है।

मेथड Secrets.shift_back लागू कीजिए जो एक वैल्यू और बाईं ओर शिफ्ट करने के स्थानों की संख्या लेता है।

Secrets.shift_back(0b0001, 2)
# => 0b0100

2. बिट मास्क लगाइए

अगला कदम है कुछ बिट्स की वैल्यू निकालने के लिए बिट मास्क लगाना। मास्क लगाने के लिए वैल्यू और मास्क के बीच बिटवाइज़ AND किया जाता है।

मेथड Secrets.apply_mask लागू कीजिए जो एक वैल्यू लेता है और उस पर एक मास्क लगाता है।

Secrets.apply_mask(0b0110, 0b0101)
# => 0b0100

3. कुछ बिट्स सेट कीजिए

बिट्स को बाईं ओर शिफ्ट करने से कुछ नए 0 बिट्स जुड़ गए हैं। इनमें से कुछ नए बिट्स को 1 पर सेट करना है। बिटवाइज़ OR कुछ बिट्स को 1 पर सेट करने और बाकी को वैसा ही बनाए रखने के लिए उपयोगी है।

मेथड Secrets.set_bits लागू कीजिए जो दो वैल्यू लेता है और उन पर बिटवाइज़ OR करता है।

Secrets.set_bits(0b0110, 0b0101)
# => 0b111

4. XOR को उलटिए

एन्क्रिप्शन प्रक्रिया का एक हिस्सा एक तय वैल्यू के साथ XOR लगाता है। मूल वैल्यू तक पहुँचने के लिए एन्क्रिप्ट की गई वैल्यू पर दोबारा उसी तय वैल्यू के साथ XOR कर देना ही काफी है। लेकिन एक गलतफहमी के कारण आपके मित्र ने XOR लगाने से पहले तय वैल्यू के बिट्स पलट दिए थे (यानी तय वैल्यू पर बिटवाइज़ NOT लगा दिया था)।

मेथड Secrets.reverse_xor लागू कीजिए जो एन्क्रिप्ट की गई वैल्यू और तय वैल्यू लेता है और मूल वैल्यू निकालता है।

Secrets.reverse_xor(0b1100, 0b0101)
# => 0b(0110)
GitHub के ज़रिए संपादित करें यह लिंक एक नई विंडो या टैब में खुलता है
Crystal Exercism

रहस्य शुरू करने के लिए तैयार हैं?

Exercism पर साइन अप कीजिए और Crystal को 26 कॉन्सेप्ट142 अभ्यास तथा असली इंसानों से मिलने वाली मेंटरिंग के साथ सीखिए और उसमें महारत हासिल कीजिए, वह भी बिल्कुल मुफ्त।