1. बिटवाइज़ लेफ्ट शिफ्ट
जावा में 3 बिटवाइज़ शिफ्ट ऑपरेटर भी हैं: यदि आपको वास्तव में आवश्यकता है, तो आप बहुत आसानी से किसी संख्या के सभी बिट्स को कई स्थानों पर बाईं या दाईं ओर स्थानांतरित कर सकते हैं।
किसी संख्या के बिट्स को बाईं ओर शिफ्ट करने के लिए, आपको बिटवाइज़ लेफ्ट शिफ्ट ऑपरेटर की आवश्यकता होती है । यह इस प्रकार लिखा गया है:
a << b
वह संख्या कहां a
है जिसके बिट्स को स्थानांतरित किया जा रहा है, और वह संख्या है जो इंगित करती है कि संख्या के बिट्स को बाईं ओर b
कितनी बार स्थानांतरित करना है। a
इस ऑपरेशन के दौरान, दाईं ओर जोड़े गए निम्न-क्रम बिट शून्य होते हैं।
उदाहरण:
उदाहरण | परिणाम |
---|---|
|
|
|
|
|
|
|
|
एक अंक को बाईं ओर स्थानांतरित करने का प्रभाव किसी संख्या को 2 से गुणा करने के समान होता है।
किसी संख्या को 16 से गुणा करना चाहते हैं? 16 2 4 के समान है । तो आप संख्या 4 अंकों को बाईं ओर शिफ्ट करें
2. बिटवाइज़ दाएँ शिफ्ट करें
बिट्स को दाईं ओर भी शिफ्ट किया जा सकता है। ऐसा करने के लिए, बिटवाइज़ राइट शिफ्ट ऑपरेटर का उपयोग करें । यह इस प्रकार लिखा गया है:
a >> b
वह संख्या कहां a
है जिसके बिट्स को स्थानांतरित किया जा रहा है, और संख्या के बिट्स को दाईं ओर b
स्थानांतरित करने की संख्या है ।a
उदाहरण:
उदाहरण | परिणाम |
---|---|
|
|
|
|
|
|
|
|
एक अंक को दायीं ओर शिफ्ट करने का वही प्रभाव होता है जो किसी संख्या को 2 से विभाजित करने पर होता है।
इस ऑपरेशन के दौरान, बाईं ओर जोड़े गए उच्च-क्रम बिट शून्य हैं, लेकिन हमेशा नहीं !
एक हस्ताक्षरित संख्या के सबसे बाईं ओर के बिट को साइन बिट कहा जाता है : यदि संख्या धनात्मक है, तो यह है 0
; लेकिन यदि संख्या ऋणात्मक है, तो यह बिट है 1
।
किसी संख्या के बिट्स को दाईं ओर स्थानांतरित करते समय, साइन बिट का मान भी सामान्य रूप से शिफ्ट हो जाएगा और संख्या का चिह्न खो जाएगा। तदनुसार, ऋणात्मक संख्याओं के लिए (जहां सबसे बाईं ओर बिट है 1
), इस बिट को विशेष उपचार मिलता है। किसी संख्या के बिट्स को दाईं ओर स्थानांतरित करते समय, 0
बाईं ओर a जोड़ा जाता है यदि बाईं ओर बिट होता है 0
, और बाईं 1
ओर जोड़ा जाता है यदि बाईं ओर बिट होता है 1
।
लेकिन उपरोक्त उदाहरण में, वह परिणाम प्रतीत नहीं होता है। क्यों? क्योंकि पूर्णांक शाब्दिक int
s हैं, और वास्तव में इसका अर्थ है । यानी सबसे बाईं ओर का बिट शून्य है।0b11111111
0b00000000000000000000000011111111
कई प्रोग्रामर राइट-शिफ्ट के इस व्यवहार से निराश हैं और संख्या को हमेशा शून्य से जोड़ना पसंद करेंगे। इसलिए जावा ने एक और राइट शिफ्ट ऑपरेटर जोड़ा ।
यह इस प्रकार लिखा गया है:
a >>> b
वह संख्या कहां a
है जिसके बिट्स को स्थानांतरित किया जा रहा है, और संख्या के बिट्स को दाईं ओर b
स्थानांतरित करने की संख्या है । a
संख्या के साइन बिट के मूल मान की परवाह किए बिना, यह ऑपरेटर हमेशा बाईं ओर शून्य जोड़ता है a
।
3. झंडों के साथ काम करना
प्रोग्रामर्स ने बिटवाइज़ और शिफ्ट ऑपरेशंस के आधार पर अध्ययन का लगभग पूरी तरह से नया क्षेत्र बनाया: फ़्लैग्स के साथ काम करना।
जब कंप्यूटरों में बहुत कम मेमोरी होती थी, तो बहुत सारी सूचनाओं को एक ही नंबर में रटना बहुत लोकप्रिय था। एक संख्या को बिट्स की एक सरणी के रूप में माना जाता था: एक इंट 32 बिट है, और एक लंबा 64 बिट है।
आप इतनी संख्या में बहुत सारी जानकारी लिख सकते हैं, खासकर यदि आपको तार्किक ( true
या false
) मान संग्रहीत करने की आवश्यकता है। एक एकल long
एक boolean
सरणी की तरह है जिसमें 64 तत्व शामिल हैं। इन बिट्स को फ़्लैग्स कहा जाता था और निम्नलिखित ऑपरेशनों का उपयोग करके उनमें हेरफेर किया गया था:
-
झंडा सेट करें(एक विशिष्ट बिट के बराबर बनाओ
1
) -
रीसेट ध्वज(एक विशिष्ट बिट के बराबर बनाओ
0
) -
चेक ध्वज(एक विशिष्ट बिट के मान की जाँच करें)
और यहाँ बताया गया है कि यह बिटवाइज़ ऑपरेटरों के साथ कैसे किया जाता है।
झंडा लगाना
एक विशिष्ट बिट को पर सेट करने के लिए 1
, आपको उस संख्या के बीच जिसका बिट आप सेट करना चाहते हैं और एक विशेष रूप से बनाई गई संख्या, जहां केवल वह बिट है, के बीच थोड़ा सा या संचालन करने की आवश्यकता है 1
।
उदाहरण के लिए, मान लें कि आपके पास संख्या है 0b00001010
और आपको 5वें बिट को पर सेट करने की आवश्यकता है 1
। उस स्थिति में, आपको चाहिए:
0b00001010 | 0b00010000 = 0b00011010
यदि 5वां बिट पहले से ही एक पर सेट कर दिया गया होता, तो कुछ भी नहीं बदला होता।
सामान्य तौर पर, ध्वज को स्थापित करने का कार्य निम्नानुसार लिखा जा सकता है
a | (1 << b)
वह संख्या कहां a
है जिसका बिट पर सेट किया जाएगा 1
। और b
सेट की जाने वाली बिट की स्थिति है। यहां लेफ्ट शिफ्ट ऑपरेटर का उपयोग करना बेहद सुविधाजनक है, क्योंकि आप तुरंत बता सकते हैं कि हम किस बिट के साथ काम कर रहे हैं।
एक ध्वज को रीसेट करना
किसी विशिष्ट बिट को रीसेट करने के लिए (यानी इसे सेट करें 0
) अन्य बिट्स को परेशान किए बिना, आपको &
उस संख्या के बीच एक ऑपरेशन करने की आवश्यकता है जिसका बिट आप रीसेट करना चाहते हैं (यानी सेट करें 0
) और एक विशेष रूप से बनाई गई संख्या, जहां सभी बिट्स को 1
छोड़कर बराबर हैं उस बिट के लिए जिसे आप रीसेट करना चाहते हैं।
उदाहरण के लिए, मान लें कि आपके पास संख्या है 0b00001010
और आपको 4 बिट को सेट करने की आवश्यकता है 0
। उस स्थिति में, आपको चाहिए:
0b00001010 & 0b11110111 = 0b00000010
यदि चौथा बिट पहले ही शून्य पर सेट कर दिया गया होता, तो कुछ भी नहीं बदला होता।
सामान्य तौर पर, ध्वज को रीसेट करने का कार्य निम्नानुसार लिखा जा सकता है
a & ~(1 << b)
वह संख्या कहां a
है जिसका बिट पर रीसेट किया जाएगा 0
। और b
बिट की स्थिति को साफ किया जाना है।
उस संख्या को प्राप्त करने के लिए जहां सभी बिट्स हैं 1
सिवाय उस बिट के जिसे हम शून्य होना चाहते हैं, हम पहले 1 b स्थिति को बाईं ओर शिफ्ट करते हैं, और फिर NOT
परिणाम को उलटने के लिए बिटवाइज़ ऑपरेटर का उपयोग करते हैं।
एक झंडे की जाँच करना
किसी विशिष्ट ध्वज को सेट करने या रीसेट करने के अलावा, कभी-कभी आपको केवल यह जांचने की आवश्यकता होती है कि क्या दिया गया ध्वज सेट है, अर्थात क्या एक निश्चित बिट के बराबर है 1
। यह बिटवाइज़ के साथ करना काफी आसान है &
।
1
उदाहरण के लिए, मान लें कि आपको यह जाँचने की आवश्यकता है कि क्या 4था बिट संख्या में सेट है 0b00001010
। फिर आपको यह करने की ज़रूरत है:
if ( (0b00001010 & 0b00001000) == 0b00001000 )
सामान्य तौर पर, एक झंडे की जाँच करने की क्रिया को इस प्रकार लिखा जा सकता है
(a & (1 << b)) == (1 << b)
a
वह नंबर कहां है जिसका बिट चेक किया जा रहा है। और b
जाँच की जाने वाली बिट की स्थिति है।
4. एन्क्रिप्शन
XOR
साधारण एन्क्रिप्शन के लिए प्रोग्रामर अक्सर बिटवाइज़ ऑपरेशन का उपयोग करते हैं। सामान्य तौर पर, ऐसा एन्क्रिप्शन इस तरह दिखता है:
result = number ^ password;
number
वह डेटा कहां है जिसे हम एन्क्रिप्ट करना चाहते हैं, password
डेटा के लिए "पासवर्ड" के रूप में उपयोग की जाने वाली एक विशेष संख्या है, और result
एन्क्रिप्टेड संख्या है।
number == (number ^ password) ^ password;
यहां महत्वपूर्ण बात यह है कि जब XOR
ऑपरेटर को किसी संख्या पर दो बार लागू किया जाता है, तो यह "पासवर्ड" की परवाह किए बिना मूल संख्या उत्पन्न करता है।
number
से पुनर्प्राप्त करने के लिए encrypted result
, आपको बस फिर से ऑपरेशन करने की आवश्यकता है:
original number = result ^ password;
उदाहरण:
class Solution
{
public static int[] encrypt(int[] data, int password)
{
int[] result = new int[data.length];
for (int i = 0; i < data.length; i++)
result[i] = data[i] ^ password;
return result;
}
public static void main(String[] args)
{
int[] data = {1, 3, 5, 7, 9, 11};
int password = 199;
// Encrypt the array of data
int[] encrypted = encrypt(data, password);
System.out.println(Arrays.toString(encrypted));
// Decrypt the array of data
int[] decrypted = encrypt(encrypted, password);
System.out.println(Arrays.toString(decrypted));
}
}
GO TO FULL VERSION