2011-01-27 12 views
10

संभव डुप्लिकेट:
why is 1>>32 == 1?क्यों है (-1 >>> 32) = -1?

-1 द्विआधारी करने के लिए एक पूर्णांक परिवर्तित रूप में 32 1 के द्वारा प्रतिनिधित्व किया है। जब मैं इसे 31 बार सही-स्थानांतरित करता हूं, तो मुझे 1 (31 0 और एक 1) मिलता है। लेकिन जब मैं इसे 32 बार सही-स्थानांतरित करता हूं, तो मुझे फिर से मिलता है। यह 0 के बराबर नहीं होना चाहिए?

+1

यह जावा जैसा दिखता है। मैं कई भाषाओं के बारे में नहीं जानता जो'>> 'ऑपरेटर को परिभाषित करते हैं। – leppie

+0

मैं इस पर आया, जबकि मैं जावा की मूल बातें सीखने की कोशिश कर रहा था, हां, लेकिन मैंने इसे टैग नहीं किया क्योंकि मुझे लगता है कि थोड़ी सी स्थानांतरण एक सामान्य सामान्य अवधारणा थी। – user183037

+1

जांचें: http://stackoverflow.com/questions/3170412/why-is-132-1 –

उत्तर

17

जावा विनिर्देश shift operators इस प्रकार बताते हैं:

तो बाएं हाथ संकार्य के पदोन्नत प्रकार int, केवल पांच दायां संकार्य का सबसे कम क्रम बिट्स परिवर्तन के रूप में उपयोग किया जाता है दूरी। ऐसा लगता है जैसे दाएं हाथ के ऑपरेंड को मास्क वैल्यू 0x1f के साथ थोड़ा सा तार्किक और ऑपरेटर & (§15.22.1) के अधीन किया गया था। वास्तव में उपयोग की जाने वाली शिफ्ट दूरी हमेशा 0 से 31 तक की सीमा में होती है।

32 & 0x1f का मान शून्य है।

बाईं संकार्य long है, तो आप सही संकार्य के लिए एक अतिरिक्त बिट पाने के लिए, के बजाय 63 ऊपरी सीमा का विस्तार 31.


आदेश स्थानांतरण से किसी भी विशिष्ट उम्मीद मूल्य पाने के लिए - दाईं ओर 1, आपको पूर्णांक के अंतर्निहित बाइनरी प्रतिनिधित्व (उदाहरण के लिए, दो पूरक) के साथ-साथ बिट्स की संख्या (उदाहरण के लिए, 32) निर्दिष्ट करने की आवश्यकता है। प्रत्येक प्रोग्रामिंग भाषा उनको अलग-अलग परिभाषित कर सकती है, लेकिन कार्यान्वयन के लिए चीजों को सरल रखने के हित में, वे आमतौर पर निर्दिष्ट करेंगे कि उपलब्ध बिट्स की संख्या से अधिक स्थानांतरित होने की अनुमति नहीं है। ऐसा अक्सर होता है क्योंकि अंतर्निहित CPU हार्डवेयर इसका समर्थन नहीं करता है, या तो। आखिरकार, यदि आप उन कई बिट्स को स्थानांतरित करना चाहते हैं, तो बाएं ऑपरेंड अब महत्वपूर्ण नहीं है क्योंकि नतीजा हमेशा एक जैसा होगा।

+0

धन्यवाद, यह समझ में आता है। – user183037

+1

बीटीडब्लू इसका मतलब है कि आप 'x '63' या' x >> -1' का उपयोग करके 'x' का शीर्ष बिट प्राप्त कर सकते हैं चाहे x int या long है। ;) –

+0

स्थानांतरण भी 32/64 बिट सिस्टम पर निर्भर हो सकता है। – TheCottonSilk

संबंधित मुद्दे