रहस्य

रहस्य

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

परिचय

बिट मैनिपुलेशन

Java में byte, short, int, long या char के बिट्स बदलने के लिए ऑपरेटर होते हैं।

शिफ्ट ऑपरेटर

बिट्स को बाईं ओर शिफ्ट करने के लिए << का और दाईं ओर शिफ्ट करने के लिए >> का इस्तेमाल कीजिए।

// Shift two places to the left
0b0000_1011 << 2;
// # => 0b0010_1100

// Shift two places to the right
0b0000_1011 >> 2;
// # => 0b0000_0010

<< ऑपरेटर दाईं ओर हमेशा 0 डालता है। लेकिन >> सबसे बाईं बिट के जैसी ही बिट डालता है (संख्या ऋणात्मक हो तो 1, धनात्मक हो तो 0)।

// Shift 2 places to the right preserves the sign
// This is a negative value, whose binary representation is
// 1000_0000_0000_0000_0000_0000_0010_0110
int value = -0x7FFFFFDA;

// Shift two places to the right, preserving the sign bit
value >> 2;
// # => 1110_0000_0000_0000_0000_0000_0000_1001

दाईं ओर शिफ्ट करते समय अगर 0 डालने हों, तो इसके बजाय >>> का इस्तेमाल कीजिए।

// Shift two places to the right, inserting 0s on the left
value >>> 2;
// # => 0010_0000_0000_0000_0000_0000_0000_1001

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

बिटवाइज़ AND

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

0b0110_0101 & 0b0011_1100;
// # => 0b0010_0100
बिटवाइज़ OR

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

0b0110_0101 | 0b0011_1100;
// # => 0b0111_1101
बिटवाइज़ XOR

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

0b0110_0101 ^ 0b0011_1100;
// # => 0b0101_1001
बिटवाइज़ NOT(~)

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

~0b0110_0101;
// # => 0b1001_1010

निर्देश

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

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

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

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

Secrets.shiftBack(0b1001, 2);
# => 0b0010

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

अब कुछ बिट्स ऐसी हैं जिन्हें 1 पर सेट करना है।

Secrets.setBits मेथड बनाइए, जो एक वैल्यू और एक मास्क लेता है और वैल्यू की बिट्स को 1 पर सेट करने का परिणाम लौटाता है। वैल्यू की कोई बिट वहाँ 1 पर सेट होनी चाहिए जहाँ मास्क की बिट भी 1 हो। बाकी सभी बिट्स जैसी हैं वैसी ही रहनी चाहिए।

Secrets.setBits(0b0110, 0b0101);
# => 0b0111

3. खास बिट्स पलटिए

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

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

Secrets.flipBits(0b1100, 0b0101);
# => 0b1001

4. खास बिट्स साफ़ कीजिए

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

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

Secrets.clearBits(0b0110, 0b0101);
# => 0b0010
GitHub के ज़रिए संपादित करें यह लिंक एक नई विंडो या टैब में खुलता है
Java Exercism

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

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