बिटवाइज़ ऑपरेशनों की मदद से हम बाइनरी संख्याओं के अलग-अलग अंकों को बदल सकते हैं।
Elm अपने Bitwise मॉड्यूल में कई बिटवाइज़ ऑपरेटर देता है।
किसी संख्या के अलग-अलग बिट बदलने को मास्किंग कहते हैं।
मास्क एक ऐसी संख्या होती है जिसमें कुछ बिट एक खास तरीके से सेट किए गए होते हैं, ताकि and, or और xor जैसे बिटवाइज़ ऑपरेटरों की मदद से किसी दूसरी संख्या को बदला जा सके।
and दो संख्याओं को इस तरह मिलाता है कि सिर्फ वे बिट रखता है जो दोनों में 1 हैं।
यह देखने के लिए काम आता है कि कोई एक बिट सेट है या नहीं।
जैसे, यह जाँचने के लिए कि किसी संख्या का चौथा बिट 1 पर सेट है या नहीं, उस पर 01000 (8 दशमलव में) का मास्क लगाकर and कीजिए और देखिए कि परिणाम शून्य से अलग आता है या नहीं:
Bitwise.and 13 8 --> 8
-- 13 = 01101
-- 8 = 01000
-- and = 01000 = 8
or दो संख्याओं को इस तरह मिलाता है कि हर बिट को 1 कर देता है, अगर वह किसी एक संख्या में या दोनों में 1 है।
यह किसी खास बिट को 1 पर सेट करने के लिए काम आता है।
जैसे, 10101 में दूसरा बिट सेट करने के लिए उस पर 00010 मास्क लगाकर or कीजिए:
Bitwise.or 21 2 --> 23
-- 21 = 10101
-- 2 = 00010
-- or = 10111 = 23
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
आपके दोस्त ने अभी-अभी आपको एक ज़रूरी राज़ वाला संदेश भेजा है। दूसरों के लिए उसे पढ़ना आसान न हो, इसलिए संदेश को बिट में कई तरह के बदलाव करके एन्क्रिप्ट किया गया था। संदेश को डिक्रिप्ट करने में मदद के लिए आपको कुछ फंक्शन लिखने होंगे।
संदेश को डिक्रिप्ट करने का पहला कदम यह है कि एन्क्रिप्शन की प्रक्रिया में हुआ खिसकाव उलट दिया जाए और बिट को दाईं ओर वापस खिसका दिया जाए। डिक्रिप्शन की प्रक्रिया के आगे के कदम यह मानकर चलेंगे कि बाईं ओर से 0 डाले जाते हैं।
shiftBack फंक्शन बनाइए, जो कितने स्थान खिसकाना है वह संख्या और एक वैल्यू लेता है और खिसकाव कर देता है।
shiftBack 2 42 --> 10
इसके बाद, कुछ बिट ऐसे हैं जिन्हें 1 करना है।
setBits फंक्शन बनाइए, जो एक मास्क और एक वैल्यू लेता है और वैल्यू के बिट को 1 करने का नतीजा लौटाता है। जहाँ मास्क में बिट 1 है, वहाँ वैल्यू के बिट को भी 1 करना है। बाकी सारे बिट जैसे हैं वैसे ही रहने चाहिए।
setBits 66 212 --> 64
एन्क्रिप्शन के दौरान कुछ बिट पलट दिए जाते हैं। संदेश को डिक्रिप्ट करने के लिए उन्हें वापस पलटना होगा।
flipBits फंक्शन बनाइए, जो एक मास्क और एक वैल्यू लेता है। मास्क बताता है कि वैल्यू के कौन-से बिट पलटने हैं। अगर मास्क में बिट 1 है, तो वैल्यू में वह बिट पलट दिया जाता है। बाकी सारे बिट जैसे हैं वैसे ही रहते हैं।
flipBits 23 157 --> 138
कुछ बिट ऐसे भी हैं जो डिक्रिप्ट होने पर हमेशा 0 बन जाते हैं।
clearBits फंक्शन बनाइए, जो एक मास्क और एक वैल्यू लेता है। जहाँ मास्क में बिट 1 है, वहाँ value के बिट को 0 करना है। बाकी सारे बिट जैसे हैं वैसे ही रहने चाहिए।
clearBits 2 15 --> 13
अब जब आपके पास वे सारे फंक्शन हैं जिनकी आपको ज़रूरत है, तो आप अपने दोस्त का संदेश डिकोड कर सकते हैं। decrypt फंक्शन बनाइए, जो ये काम करता है:
decrypt 380182 --> 11840
कृपया decrypt को उन सारे फंक्शनों की मदद से बनाइए जो आपने पिछले कार्यों में बनाए थे।
Exercism पर साइन अप कीजिए और Elm को 28 कॉन्सेप्ट110 अभ्यास तथा असली इंसानों से मिलने वाली मेंटरिंग के साथ सीखिए और उसमें महारत हासिल कीजिए, वह भी बिल्कुल मुफ्त।