बिट शिफ्टिंग ऑपरेटर वही करते हैं जो उनके नाम का अर्थ है। वे बिट्स को शिफ्ट करते हैं। यहां विभिन्न शिफ्ट ऑपरेटरों के लिए एक संक्षिप्त (या नहीं-तो-संक्षिप्त) परिचय है।
संचालक
>>
अंकगणित (या हस्ताक्षरित) सही पारी ऑपरेटर है।
>>>
तार्किक (या अहस्ताक्षरित) सही पारी ऑपरेटर है।
<<
लेफ्ट शिफ्ट ऑपरेटर है, और तार्किक और अंकगणितीय दोनों पाली की जरूरतों को पूरा करता है।
इन ऑपरेटरों के सभी पूर्णांक मूल्यों के लिए लागू किया जा सकता है ( int
, long
, संभवतः short
और byte
या char
)। कुछ भाषाओं में, शिफ्ट संचालकों को किसी भी डेटाटाइप से छोटे पर लागू करने से int
स्वचालित रूप से ऑपरेंड का आकार बदल जाता है aint
।
ध्यान दें कि <<<
एक ऑपरेटर नहीं है, क्योंकि यह निरर्थक होगा।
यह भी ध्यान दें कि C और C ++ सही शिफ्ट ऑपरेटरों के बीच अंतर नहीं करते हैं । वे केवल >>
ऑपरेटर प्रदान करते हैं , और राइट-शिफ्टिंग व्यवहार कार्यान्वित प्रकारों के लिए परिभाषित किया गया है। शेष उत्तर C # / Java ऑपरेटरों का उपयोग करता है।
( >>
हस्ताक्षरित प्रकारों पर जीसीसी और क्लैंग / एलएलवीएम सहित सभी मुख्य धारा सी और सी ++ कार्यान्वयन में अंकगणित है। कुछ कोड इसे मानते हैं, लेकिन यह मानक गारंटी नहीं है। यह अपरिभाषित नहीं है , हालांकि, मानक को इसे परिभाषित करने के लिए आवश्यक है। या दूसरी तरह से। हालांकि, नकारात्मक हस्ताक्षर किए संख्या के बाएँ बदलाव है अपरिभाषित व्यवहार (अतिप्रवाह पूर्णांक हस्ताक्षर किए)। तो जब तक आप गणित सही बदलाव की जरूरत है, यह आमतौर पर ऐसा करने के लिए एक अच्छा विचार है अपने बिट बदलने अहस्ताक्षरित प्रकार के साथ।)
वाम पारी (<<)
इंटेगर को बिट्स की एक श्रृंखला के रूप में, मेमोरी में संग्रहीत किया जाता है। उदाहरण के लिए, 32-बिट के रूप में संग्रहीत संख्या 6 int
होगी:
00000000 00000000 00000000 00000110
इस बिट पैटर्न को बाईं ओर की स्थिति में शिफ्ट करने से 6 << 1
परिणाम 12 होगा:
00000000 00000000 00000000 00001100
जैसा कि आप देख सकते हैं, अंक एक स्थिति से बाईं ओर स्थानांतरित हो गए हैं, और दाईं ओर अंतिम अंक एक शून्य से भर गया है। आप यह भी ध्यान रख सकते हैं कि बाईं ओर स्थानांतरण शिफ्टिंग 2. की शक्तियों के गुणन के बराबर है। इसलिए 6 << 1
के बराबर है 6 * 2
और 6 << 3
इसके बराबर है6 * 8
। एक अच्छा अनुकूलन करने वाला कंपाइलर संभव होने पर बदलावों के साथ गुणा को प्रतिस्थापित करेगा।
गैर-परिपत्र स्थानांतरण
कृपया ध्यान दें कि ये परिपत्र पारियां नहीं हैं। इस मान को बाईं ओर एक स्थिति में स्थानांतरित करना ( 3,758,096,384 << 1
):
11100000 00000000 00000000 00000000
3,221,225,472 में परिणाम:
11000000 00000000 00000000 00000000
जो अंक "बंद अंत" में स्थानांतरित हो जाता है वह खो जाता है। यह चारों ओर नहीं लपेटता है।
तार्किक सही बदलाव (>>>)
एक तार्किक दाईं शिफ्ट बाईं शिफ्ट के लिए प्रतिलोम है। बिट्स को बाईं ओर ले जाने के बजाय, वे बस दाईं ओर बढ़ते हैं। उदाहरण के लिए, संख्या 12 को स्थानांतरित करना:
00000000 00000000 00000000 00001100
एक स्थिति से दाईं ओर ( 12 >>> 1
) हमारा मूल 6 प्राप्त करेगा:
00000000 00000000 00000000 00000110
इसलिए हम देखते हैं कि दाईं ओर स्थानांतरण 2 की शक्तियों द्वारा विभाजन के बराबर है।
खो गए बिट्स
हालाँकि, एक शिफ्ट "खो" बिट्स को पुनः प्राप्त नहीं कर सकता है। उदाहरण के लिए, यदि हम इस पैटर्न को बदलते हैं:
00111000 00000000 00000000 00000110
बाएं 4 पदों पर ( 939,524,102 << 4
), हमें 2,147,483,744 मिलते हैं:
10000000 00000000 00000000 01100000
और फिर पीछे हटना ( (939,524,102 << 4) >>> 4
) हमें 134,217,734 मिले:
00001000 00000000 00000000 00000110
एक बार बिट्स खो जाने के बाद हम अपना मूल मूल्य वापस नहीं पा सकते हैं।
अंकगणित सही बदलाव (>>)
अंकगणित सही बदलाव बिल्कुल तार्किक सही बदलाव की तरह है, शून्य के साथ पैडिंग के बजाय, यह सबसे महत्वपूर्ण बिट के साथ पैड है। ऐसा इसलिए है क्योंकि सबसे महत्वपूर्ण बिट संकेत है बिट है, या बिट जो सकारात्मक और नकारात्मक संख्याओं को अलग करता है। सबसे महत्वपूर्ण बिट के साथ पैडिंग करके, अंकगणितीय सही बदलाव साइन-संरक्षण है।
उदाहरण के लिए, यदि हम इस बिट पैटर्न को नकारात्मक संख्या के रूप में व्याख्या करते हैं:
10000000 00000000 00000000 01100000
हमारे पास नंबर -2,147,483,552 है। अंकगणितीय पारी (-2,147,483,552 >> 4) के साथ इसे सही 4 पदों पर शिफ्ट करने से हमें लाभ मिलेगा:
11111000 00000000 00000000 00000110
या संख्या -134,217,722।
इसलिए हम देखते हैं कि हमने तार्किक सही बदलाव के बजाय अंकगणितीय सही बदलाव का उपयोग करके अपने नकारात्मक संख्याओं के संकेत को संरक्षित किया है। और एक बार फिर, हम देखते हैं कि हम 2 की शक्तियों द्वारा विभाजन का प्रदर्शन कर रहे हैं।