Bitwise Operator
Bitwise Operator
अभी तक हमने जितने भी Operators के बारे में जाना है , वे सभी Operator किसी Identifier के पुरे Byte पर Operation Perform करते है | लेकिन “C” Language में कुछ ऐसे Operator भी Provide करता है , जिनका प्रयोग हम किसी Identifier की Bits पर कर सकते है | इस Operator का उपयोग सीधे ही किसी identifier की Bits पर काम करने के लिए किया जाता है | ये Operator हमेशा Integer प्रकार के Data Type के साथ ही Use किया जा सकता है | “C” Language में इनकी कुल संख्या छः होती है |
जैसाकि हमने भी
कहा है की Computer की memory में किसी मान को Store किए बिना हम उस मान के साथ कोई प्रक्रिया नहीं कर सकते है | लेकिन
चुंकि Computer
केवल एक Electronic Machine है , इसलिए हम
इसमें जिस किसी भी मान को Store करते है , वह मान Binary Digits के
रूप में ही Store होता है |
जब हम किसी Identifier
का प्रयोग करके किसी Memory Location को Access
करते है , तब वास्तव में हम उस Identifier से Associated
Memory Block के पुरे Byte को Use कर रहें होते है | लेकिन
“C”
हमें कुछ Bitwise Operator भी Provide करता है , जिनका प्रयोग करके हम किसी Identifier से Associated
पुरे Memory Byte को Access करने के बजाये Memory Byte के किसी भी Bit को Access करने की क्षमता प्राप्त करते है |
इस Bitwise
Operator का यदि ठीक तरह से प्रयोग किया जाये , तो हम हमारे Program
की Speed को बहुत तेज कर सकते है , क्योंकि Bytes
को Access करने की तुलना में Bits को Access करने में Computer को कम समय लगता है |
साथ
ही इस Operator
का प्रयोग करके Directly Memory Location के Bits
को Access करवाने के कारण हम Computer के Hardware को भी Directly Access कर पाने में सक्षम हो सकते है |
Bitwise Operators को समझने से पहले हमें ये समझना होगा की Computer विभन्न
प्रकार के Character व Integer मानों
को Computer की Memory में किस तरह से Store
करता है | Computer
में 8 Bits के समूह को Byte . 16 Bits के समूह को Word तथा 32bits के
समूह को Dword कहा जाता है |
हम जब भी Character
प्रकार का कोई Identifier Create करते है , तो
Computer एक Byte की Space को Reserve करता है , जो की 8 Bits का एक समूह होता है | इस
Byte
को इस निम्नानुसार चित्र द्वार Respresent कर
सकते है |
किसी भी Byte
या Word के Bits की Position
को हमेशा Right Side से Count किया जाता है | इस
Byte
के हर Bit में केवल True या False यानी 0 या 1 ही Store हो सकता है |
किसी
Byte
के पहले Bit (0th Position Bit ) को
Least Significant Bit (LSB) व अंतिम Bit (7th Position
Bit) को Most Significant Bit (MSB) कहा जाता
है |
किसी Signed
Character Data Type के Identifier में Most
Significant Bit हमेशा Sign को Represent
करता है | इस
Bit
का मान यदि 0 होता है , तो इसमें Stored
Bit Pattern किसी Positive संख्या को Represent
करता है , जबकि यदि इस Bit का मान 1 हो , तो इसमें Stored Bit Pattern किसी Negative
संख्या को Represent करता है |
किसी Byte
में स्थित हर Bit का उसकी Position के आधार पर एक Unique
मान होता है | किसी
Byte
के Least Significant Bit में Store हो सकने वाली संख्या का अधिकतम मान 1 हो सकता है और
हम जैसे – जैसे Least Significant Bit में Most
Significant Bit की तरफ बढते जाते है वैसे – वैसे उन Bits के मान Store करने की क्षमता पिछले मान की तुलना में
Double होती जाती है |
उदाहरण के लिए
किसी भी Byte
के 0th Position में Store हो सकने वाला अधिकतम मान 1 हो सकता है , इसलिए 1st
Position पर Store हो सकने वाली सकने का मान
पिछले Bit की अधिकतम Capacity से
दुगुना , यानी 2 हो सकता है |
इसी
तरह से 3rd
Position पर Store हो सकने वाली संख्या का
अधिकतम मान 4 हो सकता है इसी तरह से आगे भी यही क्रम जारी
रहता है | यदि हम इस
प्रक्रिया को चित्र द्वरा Represent करें तो निम्न
चित्र में हम देख सकते है की किस प्रकार से हर Bit LSB से MSB
की तरफ बदले हुए दुगने मान को Represent करने
लगता है |
चुंकि Character
Type का Variable Memory में 1 Byte या 8 Bit लेता है , इसलिए हमने इस प्रक्रिया को एक Character
प्रकार के Identifier पर Apply करके समझाया है | लेकिन
ये प्रक्रिया एक Integer प्रकार के Word
पर भी पूरी तरह से Apply होती है , अंतर केवल
इतना है की एक Integer में कम से कम 16 Bits होते है , इसलिए Bits की संख्या व उनकी Location
के आधार पर एक Integer में Data को Store करने की क्षमता काफी बढ जाती है , जिसे हम
निम्न चित्र द्वारा समझ सकते है |
इस तरह से यदि किसी Unsigned Character प्रकार के Identifier के सभी Bits में निम्न चित्रानुसार False यानी 0 Store हो , तो ये Byte Numerical मान 0 को Represent करता है |
इसी तरह से यदि
इस Byte
के सभी Bits का मान True या 1 हो , तो ये Byte निम्न
चित्रानुसार Numerical मान 255 को Represent
करता है |
Decimal Value of This
Binary [00001011] = 8+2+1 = 11
हम जानते है की
किसी भी Byte
में उसकी Bit Position पर 0 या 1 ही हो सकता है , जहां 0 Lowest Value को Represent करता है , जबकि 1 Highest
Values को Represent करता है |
इसलिए
यदि इस तरीके के आधार पर हम किसी Unsigned Character प्रकार के Identifier के सभी Bits में 0 Store कर दें , तो Byte में
Store हो सकने वाला Minimum मान 0
ही हो सकता है |
जबकि यदि सभी Bit
Position को उनकी High Value यानी 1 से Fill कर दे , तो Byte में Store
हो सकने वाला Maximum मान [1+2+8+16+32+64+128
=255] ही हो सकता है | यही
वजह है कि किसी Unsigned Character प्रकार
के Data Type में हम इससे बड़ी संख्या को Store नहीं कर सकते है |
जब हम Unsigned
Byte में Store हो सकने वाले मान की गणना करते
है , तब हमें 0 से 255 की Range
प्राप्त होती है , लेकिन जब हम एक Byte में Signed
प्रकार के मान के Store होने की Range ज्ञात करना कहते है , तब Byte का Most
Significant Bit Sign की Information को Hold
करने लगता है |
यदि
इस Bit
का मान 0 होता है , तो इसमें Stored संख्या Positive होती है , जबकि इस Bit में Stored मान 1 होने की
स्थिति में इसमें Stored Bit Pattern के आधार पर Generate
होने वाली संख्या Negative हो जाती है |
इस
स्थिति में यदि हम किसी Sign वाली संख्या की Minimum
व Maximum Range ज्ञात करना चाहें , तो Minimum
संख्या का Bit – Pattern निम्नानुसार बनेगा |
हम देख सकते है
की इस Bit
Pattern में केवल Most
Significant Bit यानी Sign Bit ही 1
है जो बता रही है , की ये संख्या एक Negative संख्या
है , साथ ही हम ये भी देख सकते है की इस MSB की Position
पर True या 1 Store होने
का मतलब ये भी है की इस संख्या का Decimal मान 128 है | यानी
इस संख्या का वास्तविक मान -128 है |
अब
यदि हम इस Byte के Bit – Pattern को Invert कर दे , यानी True को
False व False को True कर दें , तो हमें निम्नानुसार Bit – Pattern प्राप्त
होता है |
इस Bit
Pattern में MSB का मान 0 है जो बताता है की इस Byte में Stored संख्या एक Positive संख्या है |
अब
यदि हम इस संख्या का Decimal मान ज्ञात करें ,
तो हमें [1+2+4+8+16+32+64=127] प्राप्त होता है , जो की इस Byte
में Store हो सकने वाला Maximum मान है |
जिस तरह से हमने
एक Byte
की Bit Position पर Stored 0 या 1 के आधार पर एक Byte में Store
हो सकने वाले न्यूनतम व अधिकतम मान को Calculate किया है , उसी तरह से हम Integer व Long
Integer Type के Identifier में Store हो सकने वाले न्यूनतम व अधिकतम मान को भी ज्ञात कर सकते है |
इसके लिए हमें केवल
ये ध्यान रखना होता है , की 2 Byte के Integer
में 16 Bit होते है , इसलिए 2 Byte के Integer की Limit ज्ञात
करने के लिए हमें 16 Bits के Pattern के
आधार पर Range ज्ञात करना पड़ेगा |
जबकि
Long
Integer प्रकार Identifier Memory में 4 Byte
या 32 Bit Reserve करता है , इसलिए Long
Integer प्रकार के Identifer में Store
हो सकने वाली Minimum व Maximum संख्या का मान प्राप्त करने के लिए हमें 32Bit के Pattern
बनाने पडेंगे |
एक बात हमेशा
धयान रखें , कि जब किसी Identifier में Store
होने वाली संख्या Unsigned होती है , तब Byte
, Word व Dword के सभी Bits के आधार पर उसमें Store हो सकने वाली Maximum
व Minimum संख्या तय करते है , लेकिन जब किसी Byte
, Word या Dword में Store होने वाली संख्या Sign वाली होती है , तब Byte
, word व Dword के सभी Bits मिलकर उनमें Store करने के लिए आधी कम हो जाती है ,
लेकिन Negative संख्या Store करने के
लिए अभी बढ़ जाती है |
दसमलव वाले मान
भी Computer
में Bit – Pattern के रूप में ही Store
होते है , लेकिन उनके Store होने से तरीके में
थोड़ा अंतर होता है और अंतर ये होता है की हर दसमलव वाली संख्या Sign वाली संख्या ही होती है | यानी
Float , Double या Long Double संख्या कभी भी Unsigned नहीं होती है |
साथ
ही इनके Bit
Pattern के कुछ Bits दसमलव के बाद वाली संक्या
को Represent करने का काम करते है , जबकि कुछ Bits दसमलव से पहले वाली संख्या को Represent करने का काम
करते है |
No comments