2010-02-11 15 views
16

मैं इंटरनेट से क्रैम नोट्स का उपयोग कर एससीजेपी परीक्षा के लिए अभ्यास कर रहा हूं।बिटवाईट शिफ्ट ऑपरेटर। हस्ताक्षरित और हस्ताक्षरित

मेरे नोट्स के मुताबिक >> ऑपरेटर को बाएं से लाए गए साइन बिट के साथ सही शिफ्ट पर हस्ताक्षर किया जाना चाहिए। जबकि बाएं शिफ्ट ऑपरेटर << को साइन बिट को संरक्षित करना माना जाता है।

हालांकि आसपास बजाना, मैं (फ़े Integer.MAX_VALUE << 1, -2 का मूल्यांकन करते समय मैं >> ऑपरेटर के साथ हस्ताक्षर शिफ्ट करने में सक्षम कभी नहीं हूँ।

मैं गलत समझ जाना चाहिए << ऑपरेटर के साथ हस्ताक्षर शिफ्ट करने के लिए कर सकती हूं ? कुछ यहाँ है, लेकिन क्या

+0

देखें कि '-2 << 31' आपको क्या देता है। –

+0

हां, मैं देखता हूं कि आपका क्या मतलब है! –

उत्तर

39

">>" पर हस्ताक्षर किए है, क्योंकि यह संकेत रहता है यह एक पूरक के रूप में एक नंबर की बाइनरी प्रतिनिधित्व में सबसे बाईं अंकों का उपयोग करता है उदाहरण के लिए:।।

| this value is used as a filler 
    11011011 
>> 11101101 

    01010010 
>> 00101001 

">>>" इस ऑपरेटर का हस्ताक्षरित संस्करण है। यह हमेशा एक पूरक के रूप में शून्य का उपयोग करें:

11011011 
>>> 01101101 

    01010010 
>>> 00101001 

द्विआधारी प्रतिनिधित्व में सबसे बाईं अंकों की संख्या के हस्ताक्षर निर्धारित करता है। इसलिए, यदि यह '1' है तो हमारे पास ऋणात्मक मूल्य है और यदि यह '0' है - तो हमारी संख्या सकारात्मक है। यही कारण है कि एक भराव के रूप में सबसे बाएं अंक का उपयोग स्थायी हस्ताक्षर रखने की अनुमति देता है।

+0

आह, ठीक है तो मैं समझता हूं कि सही शिफ्ट ऑपरेटरों को कैसे काम करना चाहिए। धन्यवाद! लेकिन मैं "<<" के साथ साइन क्यों बदल सकता हूं? –

+0

क्योंकि यह दूसरी दिशा में बदल जाता है और सबसे बायां अंक मूल संख्या पर निर्भर करता है। यह 0 को एक भराव के रूप में उपयोग करता है लेकिन इसे आपके नंबर के दाईं ओर जोड़ता है। – Roman

+0

एक पूर्णांक का संकेत अपने बाएंतम बिट के मान द्वारा निर्धारित किया जाता है। यदि आप '0' में बदलते हैं तो '1' या इसके विपरीत, परिणाम का संकेत बदल जाता है। –

2

बदलावों के पीछे विचार यह है कि वे 2 (< < 1 की शक्तियों द्वारा गुणा और विभाजन के रूप में कार्य कर सकते हैं 1 = 2 के बराबर है, >> 2 बराबर/= 4 के बराबर है), यही कारण है कि हस्ताक्षरित संस्करण स्थानांतरित होने का अस्तित्व है। बिना हस्ताक्षर किए गए स्थानान्तरण नकारात्मक रूप से संरक्षित नहीं करता है, यद्यपि, हालांकि। < < ऑपरेटर वास्तव में संकेत को संरक्षित नहीं करता है, जैसा कि आप सुझाव देते हैं; यह बस आपके उदाहरण में होता है। 2,147,483,647 पर बाएं शिफ्ट करने का प्रयास करें; यह सकारात्मक नहीं रहता है। कारण यह है कि वे 'हस्ताक्षरित' बाएं शिफ्ट बनाने की कोशिश करने से परेशान नहीं हैं क्योंकि, यदि संख्या सकारात्मक से नकारात्मक (या वाइसवर्सा) में बदल जाती है, तो आप वैरिएबल प्रकार की सीमाओं के बाहर जाते हैं।