2009-01-20 16 views
12

मैं इस बदलाव ऑपरेटर नहीं समझ सकता (ग # संदर्भ) को समझें:पारी ऑपरेटर

class MainClass1 
{ 
static void Main() 
    { 
     int i = 1; 
     long lg = 1; 
     Console.WriteLine("0x{0:x}", i << 1); 
     Console.WriteLine("0x{0:x}", i << 33); 
     Console.WriteLine("0x{0:x}", lg << 33); 
    } 
} 

/* 
Output: 
0x2 
0x2 
0x200000000 
*/ 

class MainClass2 
{ 
    static void Main() 
    { 
     int a = 1000; 
     a <<= 4; 
     Console.WriteLine(a); 
    } 
} 

/* 
Output: 
16000 
*/ 

उत्तर

34

<< बाएं पारी ऑपरेटर है, यह एक मूल्य का द्विआधारी प्रतिनिधित्व लेता है, और सभी बिट्स "एन" स्थानों को बाईं ओर ले जाता है ("मोड" को छोड़कर, "1" देखें), शून्य के साथ वापस भरना।

>> दायां-शिफ्ट ऑपरेटर है; यह लगभग विपरीत (दाईं तरफ बढ़ रहा है), हस्ताक्षरित मानों को छोड़कर (यानी जो नकारात्मक हो सकते हैं) यह नकारात्मक मूल्यों के लिए 1s के साथ भर जाता है, अन्यथा शून्य।

1:

पारी ऑपरेटर अनिवार्य है "आधुनिक" डेटा की चौड़ाई। एक int 32 बिट्स है, इसलिए 33 (इंट 32 में) की बायां शिफ्ट बिल्कुल 1 की बाईं शिफ्ट के समान ही है। आपको सभी शून्य नहीं मिलते हैं। एक long 64 बिट्स है, इसलिए 33 की बाएं-शिफ्ट एक अलग उत्तर देती है (मूल समय 2^33)।

2:

प्रत्येक छोड़ा पारी (डेटा चौड़ाई के भीतर) एक ही (पूर्णांकों के लिए) x2 के रूप में है - तो < < 4 x2x2x2x2 = x 16 है।

यह सरल द्विआधारी है:

0000000001 = 1 

< <

को जाता है
0000000010 = 2 

< <

0000000100 = 4 

< <

को जाता है को जाता है
0000001000 = 8 
+0

हाय, क्या मैं आपको इसे और अधिक समझाने के लिए कह सकता हूं? पहले में मेरे पास 0x200000000 क्यों है और दूसरे में मेरे पास 16000 क्यों है? आपको बहुत धन्यवाद –

+0

यह कहने जैसा है "1 * 50000 1000 * 8 से अलग क्यों है" - क्योंकि आप बहुत अलग चीजें कर रहे हैं। पहला 2^33 ("पावर ऑफ") है, दूसरा 1000 * 16 है। –

+0

मैं 2^33 और 1000 के बीच के अंतर को समझने ठीक * 16 मैं जानना चाहता है कि 2^32 –

6

बस मार्क के जवाब पर विस्तार करने के लिए एक छोटे से (मार्क, तुम्हारा में यह शामिल करने के लिए स्वतंत्र लग रहा है और मैं इस सवाल का जवाब हटा देंगे) इस कल्पना की धारा 7.8 में निर्दिष्ट किया जाता:


पूर्वनिर्धारित शिफ्ट ऑपरेटर नीचे सूचीबद्ध हैं।

शिफ्ट छोड़ दिया:

  • पूर्णांक ऑपरेटर < < (int x, पूर्णांक गिनती);
  • यूंट ऑपरेटर < < (uint x, int count);
  • लंबे ऑपरेटर < < (लंबी x, int count);
  • उलंग ऑपरेटर < < (उलंग x, int count);

< < ऑपरेटर नीचे वर्णित गणना की गई कई बिट्स द्वारा एक्स को छोड़ दिया गया है।

एक्स के परिणाम प्रकार की सीमा के बाहर उच्च-आदेश बिट्स को त्याग दिया जाता है, शेष बिट्स को बायीं ओर स्थानांतरित कर दिया जाता है, और निम्न-आदेश खाली बिट स्थिति शून्य पर सेट होती है।

शिफ्ट सही:

  • पूर्णांक ऑपरेटर >> (int x, पूर्णांक गिनती);
  • यूंट ऑपरेटर >> (uint x, int count);
  • लंबे ऑपरेटर >> (लंबी एक्स, int गिनती);
  • उलंग ऑपरेटर >> (उल x, int count);

>> ऑपरेटर नीचे वर्णित गणना की गई कई बिट्स द्वारा एक्स को सीधे स्थानांतरित करता है।

जब x int int या long टाइप होता है, तो एक्स के निम्न-क्रम बिट्स को त्याग दिया जाता है, शेष बिट्स को सही स्थानांतरित किया जाता है, और उच्च-आदेश खाली बिट स्थिति शून्य पर सेट होती है यदि एक्स गैर-ऋणात्मक और सेट है यदि x नकारात्मक है तो एक के लिए।

जब एक्स यूंट या उलंग प्रकार का होता है, एक्स के निम्न-आदेश बिट्स को त्याग दिया जाता है, शेष बिट्स को सही स्थानांतरित किया जाता है, और उच्च-आदेश खाली बिट स्थिति शून्य पर सेट होती है।

जब एक्स के प्रकार int या uint है, पाली गिनती कम आदेश गिनती के पांच बिट्स द्वारा दिया जाता है:

पूर्वनिर्धारित ऑपरेटरों के लिए, बिट्स शिफ्ट करने के लिए की संख्या की गणना इस प्रकार है। दूसरे शब्दों में, शिफ्ट गणना गणना & 0x1F से गणना की जाती है।

जब x का प्रकार लंबा या उलटा होता है, तो शिफ्ट गणना कम क्रम के छह बिट्स गिनती द्वारा दी जाती है। दूसरे शब्दों में, शिफ्ट गणना गणना & 0x3F से गणना की जाती है।

यदि परिणामस्वरूप शिफ्ट गणना शून्य है, तो शिफ्ट ऑपरेटर बस x का मान वापस कर देते हैं। नौसिखिया प्रोग्रामर के लिए


+0

मैं आपकी मदद को स्वीकार करता हूं। –

2

कुछ और सूचनाएं:

का उपयोग क्यों पारी ऑपरेटरों? वे ज्यादा नहीं लगते हैं।

  1. वे वास्तव में तेजी से कर रहे हैं, क्योंकि लगभग सभी सीपीयू पारी रजिस्टरों है, जिसका अर्थ स्थानांतरण आपरेशन हार्डवेयर में किया जाता है प्रयास (चक्र) की न्यूनतम राशि में,: ठीक है, वहाँ 2 कारण हैं।

  2. क्योंकि वे तेज़ हैं, इसलिए इसका बहुत से प्रोटोकॉल और मानकों को इसका लाभ उठाने के लिए डिज़ाइन किया गया है। उदाहरण के आईपी पते के संचालन के लिए, एक सीआरसी जाँच, ग्राफिक संचालन आदि

1

आधुनिक "पाली ऑपरेटर अनिवार्य है" "डेटा की चौड़ाई।"

बकवास! यदि शिफ्ट की मात्रा डेटा की चौड़ाई से अधिक या बराबर है, तो परिणाम अपरिभाषित है। एक ही 'मॉड' ऑपरेशन की अपेक्षा न करें जो आपने देखा है, विभिन्न कंपाइलरों के साथ होने के लिए, या एक ही कंपाइलर के विभिन्न संस्करणों, या एक ही प्रोग्राम में विभिन्न शिफ्ट स्थितियों में, या जब कुछ और बदलता है। यही 'अपरिभाषित' मतलब है।

+0

वास्तविक सी # 4.0 भाषा विनिर्देश कहता है: 1) जब एक्स का प्रकार int या uint होता है, तो शिफ्ट गणना कम क्रम के पांच बिट्स गिनती द्वारा दी जाती है। दूसरे शब्दों में, शिफ्ट गणना गणना और 0x1F से गणना की जाती है। 2) जब एक्स का प्रकार लंबा या उलटा होता है, तो शिफ्ट गणना कम क्रम के छह बिट्स गिनती द्वारा दी जाती है। दूसरे शब्दों में, शिफ्ट गणना गणना और 0x3F से गणना की जाती है। – Ivan

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