2013-02-11 14 views
8

क्यों करता है, तोजावा बिट संचालन >>> बदलाव

int x = -1 // binary: 11111111111111111111111111111111 
x = x >>> 31; 

हम 00000000000000000000000000000001

लेकिन अगर

int x = -1 
x = x >>> 32; 

है हम (फिर -1) 11111111111111111111111111111111 है

नहीं बल्कि 00000000000000000000000000000000 ?

+1

क्योंकि जावा में बदलाव हमेशा स्थानांतरित मूल्य की लंबाई को मॉड्यूल करते हैं। –

+1

यह वास्तव में जानना अच्छा है, मान लीजिए कि यह गणित के दृष्टिकोण से सिर्फ सादा गलत है! –

उत्तर

13

Section 15.19 of JLS से:

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

जोर मेरा। तो:

x >>> n & 0x1f // or x >>> n % 32 

तो, x >>> 32x >>> 32 & 0x1f < ==>x >>> 0 == x के बराबर है:

x >>> n 

बराबर है।

तो अंगूठे की नियम, है जब भी आप 32 की एक बहु (int32 bits है) द्वारा एक नंबर बदलाव, आप एक ही मूल्य वापस मिलता है।

+0

+1, परफेक्ट (वाई) –

+0

आईएमएचओ, यह वास्तव में एक खराब विकल्प है! गणितीय रूप से, दोनों बिल्कुल बराबर नहीं हैं। अब, अगर यह एक बदलाव के बजाय ** घुमावदार ** ऑपरेशन था, ठीक है। लेकिन यह? उसके साथ कौन आया? –

+0

परिणामस्वरूप >> 0 को बदलने के लिए मुझे कैसे स्थानांतरित करना चाहिए? – ses

2

बिट-शिफ्ट ऑपरेशन लागू करते समय केवल दाएं हाथ के ऑपरेंड के सबसे कम 5 बिट माना जाता है। 32 === 0 // mod 32 के बाद से, परिणाम कोई स्थानांतरित नहीं है।

0

क्यों एक लंबे एल से अधिक मेरे सिर को तोड़ने एक पूरा दिन बिताया = मैं < < 32 अजीब व्यवहार कुछ बुनियादी परीक्षण लिखा था तो,, WTF पल था, और उसके बाद के लिए लंबे समय से एल = (लंबे) मैं < < 32 chnged यह काम करने के लिए।

मेरी रोहित के जवाब में केवल यही कारण है कि ऐसा क्यों है। आईए -32 इंटेल आर्किटेक्चर सॉफ्टवेयर डेवलपर मैनुअल 3:

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

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