रहस्य

रहस्य

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

परिचय

बिटवाइज़ ऑपरेशन

बिटवाइज़ ऑपरेशनों की मदद से हम बाइनरी संख्याओं के अलग-अलग अंकों को बदल सकते हैं।

Elm अपने Bitwise मॉड्यूल में कई बिटवाइज़ ऑपरेटर देता है।

आधारभूत ऑपरेशन

किसी संख्या के अलग-अलग बिट बदलने को मास्किंग कहते हैं। मास्क एक ऐसी संख्या होती है जिसमें कुछ बिट एक खास तरीके से सेट किए गए होते हैं, ताकि and, or और xor जैसे बिटवाइज़ ऑपरेटरों की मदद से किसी दूसरी संख्या को बदला जा सके।

and

and दो संख्याओं को इस तरह मिलाता है कि सिर्फ वे बिट रखता है जो दोनों में 1 हैं। यह देखने के लिए काम आता है कि कोई एक बिट सेट है या नहीं। जैसे, यह जाँचने के लिए कि किसी संख्या का चौथा बिट 1 पर सेट है या नहीं, उस पर 01000 (8 दशमलव में) का मास्क लगाकर and कीजिए और देखिए कि परिणाम शून्य से अलग आता है या नहीं:

Bitwise.and 13 8 --> 8
--  13 = 01101
--   8 = 01000
-- and = 01000 = 8
or

or दो संख्याओं को इस तरह मिलाता है कि हर बिट को 1 कर देता है, अगर वह किसी एक संख्या में या दोनों में 1 है। यह किसी खास बिट को 1 पर सेट करने के लिए काम आता है। जैसे, 10101 में दूसरा बिट सेट करने के लिए उस पर 00010 मास्क लगाकर or कीजिए:

Bitwise.or 21 2 --> 23
-- 21 = 10101
--  2 = 00010
-- or = 10111 = 23
एक्सक्लूसिव-ऑर (xor)

xor दो संख्याओं को इस तरह मिलाता है कि हर बिट को 1 कर देता है, अगर वह एक संख्या में 1 है पर दूसरी में 0। यह किसी बिट को पलटकर उसकी उलटी वैल्यू बनाने के लिए काम आता है:

Bitwise.xor 20 5 --> 17
--  20 = 10100
--   5 = 00101
-- xor = 10001 = 17
कॉम्प्लीमेंट

complement किसी संख्या का हर बिट उलट देता है (0 से 1 बन जाता है, 1 से 0)।

ध्यान दीजिए कि इससे धनात्मक संख्याएँ ऋणात्मक हो जाती हैं और ऋणात्मक संख्याएँ धनात्मक। ऐसा इसलिए होता है कि बाइनरी में ऋणात्मक संख्याएँ सबसे बाएँ स्थान पर 1 के साथ दर्शाई जाती हैं।

Bitwise.complement 21 --> -22
--         21 = 00000000000000000000000000010101
-- complement = 11111111111111111111111111101010 = -22
बिट शिफ्टिंग

नीचे दिए गए ऑपरेटर बिट को बाएँ या दाएँ, तय संख्या में जगहों तक खिसका देते हैं, जो असल में 2 की घातों से गुणा या भाग करने जैसा है।

shiftLeftBy बिट को बाईं ओर खिसकाता है और दाईं ओर से 0 भरता जाता है। जैसे, 21 को 3 जगह बाईं ओर खिसकाने के लिए:

Bitwise.shiftLeftBy 3 21 --> 168
--  21 = 10101
-- shiftLeftBy 3 = 10101000 = 168

यह कहने के बराबर है कि 21 * 2^3 = 21 * 2 * 2 * 2 = 168

shiftRightBy: बिट को दाईं ओर खिसकाता है:

Bitwise.shiftRightBy 2 21 --> 5
--  21 = 10101
-- shiftRightBy 2 = 00101 = 5

दाईं ओर 2 जगह खिसकाना पूर्णांक में 4 से भाग देने के बराबर है।

ध्यान दीजिए कि यह फंक्शन सबसे बाएँ बिट में जो भी वैल्यू है उसे दोहरा देता है। इसलिए ऋणात्मक संख्याएँ ऋणात्मक ही रहती हैं:

Bitwise.shiftRightBy 3 -21 --> -3
--  -21 = 111...101011
-- shiftRightBy 3 = 111...11101 = -3

अगर आप दाईं ओर खिसकाना चाहते हैं और खाली जगहों में शून्य भरना चाहते हैं, तो shiftRightZfBy इस्तेमाल कीजिए:

Bitwise.shiftRightZfBy 3 -21 --> 536870909
--  -21 = 111...101011
-- shiftRightZfBy 3 = 00111...11101 = 536870909

निर्देश

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

1. बिट को दाईं ओर वापस खिसकाइए

संदेश को डिक्रिप्ट करने का पहला कदम यह है कि एन्क्रिप्शन की प्रक्रिया में हुआ खिसकाव उलट दिया जाए और बिट को दाईं ओर वापस खिसका दिया जाए। डिक्रिप्शन की प्रक्रिया के आगे के कदम यह मानकर चलेंगे कि बाईं ओर से 0 डाले जाते हैं।

shiftBack फंक्शन बनाइए, जो कितने स्थान खिसकाना है वह संख्या और एक वैल्यू लेता है और खिसकाव कर देता है।

shiftBack 2 42 --> 10

2. कुछ बिट को 1 कीजिए

इसके बाद, कुछ बिट ऐसे हैं जिन्हें 1 करना है।

setBits फंक्शन बनाइए, जो एक मास्क और एक वैल्यू लेता है और वैल्यू के बिट को 1 करने का नतीजा लौटाता है। जहाँ मास्क में बिट 1 है, वहाँ वैल्यू के बिट को भी 1 करना है। बाकी सारे बिट जैसे हैं वैसे ही रहने चाहिए।

setBits 66 212 --> 64

3. चुनिंदा बिट पलटिए

एन्क्रिप्शन के दौरान कुछ बिट पलट दिए जाते हैं। संदेश को डिक्रिप्ट करने के लिए उन्हें वापस पलटना होगा।

flipBits फंक्शन बनाइए, जो एक मास्क और एक वैल्यू लेता है। मास्क बताता है कि वैल्यू के कौन-से बिट पलटने हैं। अगर मास्क में बिट 1 है, तो वैल्यू में वह बिट पलट दिया जाता है। बाकी सारे बिट जैसे हैं वैसे ही रहते हैं।

flipBits 23 157 --> 138

4. चुनिंदा बिट को 0 कीजिए

कुछ बिट ऐसे भी हैं जो डिक्रिप्ट होने पर हमेशा 0 बन जाते हैं।

clearBits फंक्शन बनाइए, जो एक मास्क और एक वैल्यू लेता है। जहाँ मास्क में बिट 1 है, वहाँ value के बिट को 0 करना है। बाकी सारे बिट जैसे हैं वैसे ही रहने चाहिए।

clearBits 2 15 --> 13

5. संदेश डिक्रिप्ट कीजिए

अब जब आपके पास वे सारे फंक्शन हैं जिनकी आपको ज़रूरत है, तो आप अपने दोस्त का संदेश डिकोड कर सकते हैं। decrypt फंक्शन बनाइए, जो ये काम करता है:

  1. अपने दोस्त के जन्म के साल (1996) वाले बिट को 1 कीजिए।
  2. नतीजे को उस साल (2009) से पलटिए, जिस साल आप दोनों पहली बार मिले थे।
  3. आप दोनों साथ में जितनी कक्षाएँ लेते हैं (5), उतने स्थान बिट को वापस खिसकाइए।
  4. पहला और पाँचवाँ बिट 0 कीजिए।
decrypt 380182 --> 11840

कृपया decrypt को उन सारे फंक्शनों की मदद से बनाइए जो आपने पिछले कार्यों में बनाए थे।

GitHub के ज़रिए संपादित करें यह लिंक एक नई विंडो या टैब में खुलता है
Elm Exercism

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

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