2009-03-31 35 views
15

int a = 1 << 32; int b = 1 << 31 << 1;जावा में, बिट्सफिफ्ट का उपयोग करते समय, 1 << 32! = 1 << 31 << 1 क्यों होता है?

एक == 1 क्यों है? बी 0 है जैसा कि मैंने उम्मीद की थी।

+1

एक संबंधित (* नहीं * डुप्लिकेट) प्रश्न है http://stackoverflow.com/questions/644708/why-use-only-the-lower-five-bits-of-the-shift-operand-when-shifting -ए -32-बिट-वैल्यू –

उत्तर

23

सभी बदलावों को इन्ट्स के लिए 32 और लंबे समय तक 64 64 के लिए किया जाता है।

section 15.19 of the spec से

:

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

तो बाएं हाथ के पदोन्नत प्रकार संकार्य long है, तो केवल छह दाएँ हाथ संकार्य के सबसे कम आदेश बिट पारी दूरी के रूप में उपयोग किया जाता है। ऐसा लगता है कि दाएं हाथ ऑपरेंड को तार्किक और ऑपरेटर & (§15.22.1) मास्क मान 0x3f के साथ थोड़ा सा किया गया था। शिफ्ट वास्तव में उपयोग की जाने वाली दूरी हमेशा 0 से 63, समेत है।

क्यों भाषा कि जिस तरह से डिजाइन किया गया था के रूप में - मुझे पता नहीं है, लेकिन सी # एक ही डिजाइन निर्णय है। यहां बताया गया है एनोटेट ECMA सी # कल्पना का कहना है:

सी # जानबूझकर एक miinimum को कार्यान्वयन से परिभाषित व्यवहार रहता है। उन्हें केवल तभी स्वीकार किया जाता है जब को समान व्यवहार का प्रभाव प्रभाव (जैसे कुछ फ़्लोटिंग-पॉइंट परिशुद्धता समस्याओं के लिए) होगा। इसलिए, का आकार प्रत्येक अभिन्न प्रकार ठीक निर्दिष्ट है, और वर्ण सेट यूनिकोड के लिए तय है।

शिफ्ट ऑपरेशंस के लिए, वर्दी व्यवहार निर्दिष्ट है। यह एक भी अतिरिक्त अनुदेश (& 0x1F या & 0x3F) कि आधुनिक प्रोसेसर पर केवल एक छोटे से लागत आती का प्रयोग कर प्राप्त किया जा सकता है, खासकर जब से यह स्मृति को संदर्भित नहीं करती। फ्लोटिंग-पॉइंट ऑपरेशंस के विपरीत, शिफ्ट व्यवहार में अंतर नाटकीय होगा यदि प्रोसेसर की ओर से छोड़ा गया है; सटीक में अंतर के बजाय, विभिन्न अभिन्न परिणाम उत्पादित होंगे।

इस निर्णय में समिति विभिन्न प्रोसेसर आर्किटेक्चर की संख्या के लिए संदर्भ सामग्री का अध्ययन किया। शिफ्ट रेंज -32 के बाहर की गणना के लिए व्यवहार में स्थिरता है। + 32 के लिए 32-बिट ऑपरेंड, और क्रमशः -64 .. 64-बिट ऑपरेटरों के लिए 64।

(वहाँ तो कुछ उदाहरण की एक सूची है।)

यह मेरे लिए एक पूरी तरह से उचित स्पष्टीकरण लगता है। संगठनात्मकता निश्चित रूप से महत्वपूर्ण है, और अगर को लागू करना असंभव होगा कुछ सिस्टम पर एक प्रदर्शन करने वाले तरीके से लगातार व्यवहार, मुझे लगता है कि यह एक उचित समाधान है।

+0

मुझे लगता है कि ऐसा इसलिए है क्योंकि यह 32 बिट्स के अंतर को स्थानांतरित करने के लिए काफी व्यर्थ है: परिणाम हमेशा 0 होगा, नहीं? – PhiLho

+1

ठीक है, स्थिति तब उत्पन्न होगी जब आप जिस राशि को स्थानांतरित करना चाहते हैं वह कहता है, उपयोगकर्ता परिभाषित चर। तो हाँ, यह सिर्फ संख्या शून्य होना चाहिए, लेकिन मैं बस 32 बिट मामले के लिए एक चेक डालना नहीं चाहता। – CookieOfFortune

+1

"बी> 32? 0: एक << बी" का उपयोग * इतना * बुरा नहीं है ... –

0

प्रोसेसर शिफ्ट निर्देशों को कार्यान्वित करने में कुछ अंतर है।

उदाहरण के लिए, आईआईआरसी, एआरएम प्रोसेसर (32-बिट आईएसए) स्थानांतरित रजिस्टर के कम से कम महत्वपूर्ण बाइट लेते हैं। (बदलाव वास्तव में एआरएम पर स्टैंडअलोन निर्देश नहीं हैं)।

जब तक अंतर्निहित प्रोसेसर को स्थानांतरित करने के लिए एक बेहद समझदार तरीका है, तो शिफ्ट बड़ी है और शाखा (वास्तव में केवल एआरएम पर) की जांच करने के लिए कम से कम महत्वपूर्ण बिट्स (एक निर्देश आमतौर पर) को साफ़ करना आसान है। आम तौर पर एक निर्देश जोड़ता है क्योंकि सभी निर्देश सशर्त होते हैं)।

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