1. बिटवाइज़ लेफ्ट शिफ्ट

जावा में 3 बिटवाइज़ शिफ्ट ऑपरेटर भी हैं: यदि आपको वास्तव में आवश्यकता है, तो आप बहुत आसानी से किसी संख्या के सभी बिट्स को कई स्थानों पर बाईं या दाईं ओर स्थानांतरित कर सकते हैं।

किसी संख्या के बिट्स को बाईं ओर शिफ्ट करने के लिए, आपको बिटवाइज़ लेफ्ट शिफ्ट ऑपरेटर की आवश्यकता होती है । यह इस प्रकार लिखा गया है:

a << b

वह संख्या कहां aहै जिसके बिट्स को स्थानांतरित किया जा रहा है, और वह संख्या है जो इंगित करती है कि संख्या के बिट्स को बाईं ओर bकितनी बार स्थानांतरित करना है। aइस ऑपरेशन के दौरान, दाईं ओर जोड़े गए निम्न-क्रम बिट शून्य होते हैं।

उदाहरण:

उदाहरण परिणाम
0b00000011 << 1
0b00000110
0b00000011 << 2
0b00001100
0b00000011 << 5
0b01100000
0b00000011 << 20
0b001100000000000000000000

एक अंक को बाईं ओर स्थानांतरित करने का प्रभाव किसी संख्या को 2 से गुणा करने के समान होता है।

किसी संख्या को 16 से गुणा करना चाहते हैं? 16 2 4 के समान है । तो आप संख्या 4 अंकों को बाईं ओर शिफ्ट करें


2. बिटवाइज़ दाएँ शिफ्ट करें

बिट्स को दाईं ओर भी शिफ्ट किया जा सकता है। ऐसा करने के लिए, बिटवाइज़ राइट शिफ्ट ऑपरेटर का उपयोग करें । यह इस प्रकार लिखा गया है:

a >> b

वह संख्या कहां aहै जिसके बिट्स को स्थानांतरित किया जा रहा है, और संख्या के बिट्स को दाईं ओर bस्थानांतरित करने की संख्या है ।a

उदाहरण:

उदाहरण परिणाम
0b11000011 >> 1
0b01100001
0b11000011 >> 2
0b00110000
0b11000011 >> 5
0b00000110
0b11000011 >> 20
0b00000000

एक अंक को दायीं ओर शिफ्ट करने का वही प्रभाव होता है जो किसी संख्या को 2 से विभाजित करने पर होता है।

इस ऑपरेशन के दौरान, बाईं ओर जोड़े गए उच्च-क्रम बिट शून्य हैं, लेकिन हमेशा नहीं !

महत्वपूर्ण!

एक हस्ताक्षरित संख्या के सबसे बाईं ओर के बिट को साइन बिट कहा जाता है : यदि संख्या धनात्मक है, तो यह है 0; लेकिन यदि संख्या ऋणात्मक है, तो यह बिट है 1

किसी संख्या के बिट्स को दाईं ओर स्थानांतरित करते समय, साइन बिट का मान भी सामान्य रूप से शिफ्ट हो जाएगा और संख्या का चिह्न खो जाएगा। तदनुसार, ऋणात्मक संख्याओं के लिए (जहां सबसे बाईं ओर बिट है 1), इस बिट को विशेष उपचार मिलता है। किसी संख्या के बिट्स को दाईं ओर स्थानांतरित करते समय, 0बाईं ओर a जोड़ा जाता है यदि बाईं ओर बिट होता है 0, और बाईं 1ओर जोड़ा जाता है यदि बाईं ओर बिट होता है 1

लेकिन उपरोक्त उदाहरण में, वह परिणाम प्रतीत नहीं होता है। क्यों? क्योंकि पूर्णांक शाब्दिक ints हैं, और  वास्तव में इसका अर्थ है । यानी सबसे बाईं ओर का बिट शून्य है।0b111111110b00000000000000000000000011111111

कई प्रोग्रामर राइट-शिफ्ट के इस व्यवहार से निराश हैं और संख्या को हमेशा शून्य से जोड़ना पसंद करेंगे। इसलिए जावा ने एक और राइट शिफ्ट ऑपरेटर जोड़ा ।

यह इस प्रकार लिखा गया है:

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));
   }
}