1. बिटवाइज डावीकडे शिफ्ट

Java मध्ये 3 bitwise shift ऑपरेटर देखील आहेत : जर तुम्हाला खरोखर गरज असेल, तर तुम्ही अगदी सोप्या पद्धतीने अनेक स्थानांचे सर्व बिट्स डावीकडे किंवा उजवीकडे हलवू शकता.

नंबरचे बिट डावीकडे शिफ्ट करण्यासाठी, तुम्हाला bitwise डावा शिफ्ट ऑपरेटर आवश्यक आहे . हे असे लिहिले आहे:

a << b

ती संख्या कोठे aआहे ज्याचे बिट शिफ्ट केले जात आहेत आणि bही संख्या आहे जी संख्या किती वेळा aडावीकडे हलवायची हे दर्शवते. या ऑपरेशन दरम्यान, उजवीकडे जोडलेले लो-ऑर्डर बिट्स शून्य आहेत.

उदाहरणे:

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

एक अंक डावीकडे हलवण्याचा परिणाम 2 ने गुणाकार करण्यासारखाच होतो.

संख्या १६ ने गुणाकार करायची आहे? 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डावीकडील बिट असल्यास डावीकडे a जोडला जातो 1.

परंतु वरील उदाहरणात, तो परिणाम दिसत नाही. का? कारण पूर्णांक अक्षरे ints आहेत आणि  प्रत्यक्षात याचा अर्थ आहे . म्हणजेच, सर्वात डावीकडील बिट शून्य आहे.0b111111110b00000000000000000000000011111111

बरेच प्रोग्रामर या उजव्या-शिफ्ट वर्तनामुळे निराश झाले आहेत आणि संख्या नेहमी शून्याने पॅड करणे पसंत करतात. म्हणून Java ने दुसरा उजवा शिफ्ट ऑपरेटर जोडला .

हे असे लिहिले आहे:

a >>> b

ज्या क्रमांकाचे बिट शिफ्ट केले जात आहेत ती संख्या कोठे a आहे आणि b  त्या संख्येचे बिट aउजवीकडे किती वेळा हलवायचे आहे. नंबरच्या चिन्ह बिटच्या मूळ मूल्याकडे दुर्लक्ष करून हा ऑपरेटर नेहमी डावीकडे शून्य जोडतो a.



3. ध्वजांसह कार्य करणे

प्रोग्रामरनी बिटवाइज आणि शिफ्ट ऑपरेशन्सच्या आधारे अभ्यासाचे जवळजवळ संपूर्ण नवीन क्षेत्र तयार केले: ध्वजांसह कार्य करणे.

जेव्हा कॉम्प्युटरची मेमरी फारच कमी होती, तेव्हा एका नंबरमध्ये बरीच माहिती क्रॅम करणे हे अत्यंत लोकप्रिय होते. संख्या बिट्सची अॅरे मानली गेली: एक इंट 32 बिट आहे आणि एक लांब 64 बिट आहे.

तुम्ही अशा संख्येत बरीच माहिती लिहू शकता, विशेषत: जर तुम्हाला तार्किक ( trueकिंवा false) मूल्ये साठवायची असतील. एकल 64 घटकांच्या longअ‍ॅरेप्रमाणे आहे . या बिट्सला फ्लॅगboolean म्हटले गेले आणि पुढील ऑपरेशन्स वापरून हाताळले गेले:

  • ध्वज सेट करा
    (विशिष्ट बिट समान करा 1)
  • ध्वज रीसेट करा
    (विशिष्ट बिट समान करा 0)
  • ध्वज तपासा
    (विशिष्ट बिटचे मूल्य तपासा)

आणि बिटवाइज ऑपरेटर्ससह ते कसे केले जाते ते येथे आहे.

ध्वज सेट करणे

विशिष्ट बिट वर सेट करण्‍यासाठी 1, तुम्‍हाला तुम्‍हाला ज्या क्रमांकाचा बिट सेट करायचा आहे आणि एक खास तयार केलेला आकडा, जेथे फक्त तो बिट आहे, त्‍यामध्‍ये bitwise OR ऑपरेशन करणे आवश्‍यक आहे 1.

उदाहरणार्थ, समजा तुमच्याकडे नंबर आहे 0b00001010आणि तुम्हाला 5 वा बिट वर सेट करणे आवश्यक आहे 1. या प्रकरणात, आपण हे करणे आवश्यक आहे:

0b00001010 | 0b00010000 = 0b00011010

जर 5 वा बिट आधीच एक वर सेट केला असता, तर काहीही बदलले नसते.

सर्वसाधारणपणे, ध्वज सेट करण्याचे ऑपरेशन खालीलप्रमाणे लिहिले जाऊ शकते

a | (1 << b)

a नंबर कुठे आहे ज्याचा बिट वर सेट केला जाईल 1. आणि b सेट करावयाच्या बिटची स्थिती आहे. डावी शिफ्ट ऑपरेटर वापरणे येथे अतिशय सोयीचे आहे, कारण आम्ही कोणत्या बिटसह काम करत आहोत हे तुम्ही लगेच सांगू शकता.

ध्वज रीसेट करत आहे

इतर बिट्समध्ये अडथळा न आणता विशिष्ट बिट रीसेट करण्यासाठी (म्हणजे ते सेट करा ), तुम्हाला ज्या नंबरचा बिट तुम्हाला रीसेट करायचा आहे (म्हणजे सेट करा) आणि विशेष तयार केलेल्या संख्येच्या दरम्यान ऑपरेशन 0करणे आवश्यक आहे , जेथे सर्व बिट्स वगळता सर्व बिट्स समान आहेत आपण रीसेट करू इच्छित बिटसाठी.&01

उदाहरणार्थ, समजा तुमच्याकडे नंबर आहे 0b00001010आणि तुम्हाला 4 था बिट वर सेट करणे आवश्यक आहे 0. या प्रकरणात, आपण हे करणे आवश्यक आहे:

0b00001010 & 0b11110111 = 0b00000010

जर 4था बिट आधीच शून्यावर सेट केला असता, तर काहीही बदलले नसते.

सर्वसाधारणपणे, ध्वज रीसेट करण्याचे ऑपरेशन खालीलप्रमाणे लिहिले जाऊ शकते

a & ~(1 << b)

तो नंबर कुठे a आहे ज्याचा बिट वर रीसेट केला जाईल 0. आणि b बिटची स्थिती साफ करायची आहे.

1एक संख्या मिळवण्यासाठी जिथे आपल्याला शून्य करायचे आहे त्याशिवाय सर्व बिट्स आहेत , आपण प्रथम 1 b  पोझिशन्स डावीकडे हलवतो आणि नंतर NOTपरिणाम उलट करण्यासाठी bitwise ऑपरेटर वापरतो.

ध्वज तपासत आहे

विशिष्ट ध्वज सेट करणे किंवा रीसेट करण्याव्यतिरिक्त, काहीवेळा आपल्याला दिलेला ध्वज सेट केला आहे की नाही हे तपासणे आवश्यक आहे, म्हणजे विशिष्ट बिट बरोबर आहे की नाही 1. हे bitwise सह करणे अगदी सोपे आहे &.

उदाहरणार्थ, समजा तुम्हाला 4 था बिट 1नंबरमध्ये सेट केला आहे की नाही हे तपासण्याची आवश्यकता आहे 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));
   }
}