2009-09-21 15 views
6

मैंने इसे दो बार देखा है, लेकिन ऐसा लगता है कि बिटवाई शिफ्ट का उपयोग करके पठनीयता में बाधा आती है। इसका उपयोग क्यों किया जाता है? क्या यह सिर्फ 2 से गुणा करने से तेज़ है?क्या '* 2' के बजाय '<< 1' का उपयोग करने का कोई फायदा है?

+0

यह परीक्षण करना आसान है। बस इसका परीक्षण करें। –

+0

कैसे? 'समय' का उपयोग करके? –

उत्तर

17

यह पुराने कंपाइलर्स पर तेज़ है जो बाएं शिफ्ट निर्देश उत्सर्जित करके * 2 कॉल को अनुकूलित नहीं करते हैं। यह अनुकूलन वास्तव में पहचानना आसान है और कोई भी सभ्य संकलक पहले से ही करता है।

यदि यह पठनीयता को प्रभावित करता है, तो इसका उपयोग न करें। सबसे पहले अपने कोड को सबसे स्पष्ट और संक्षिप्त फैशन में पहले लिखें, फिर यदि आपके पास गति की समस्याएं वापस आती हैं और प्रोफ़ाइल होती हैं और हाथ अनुकूलन करती हैं।

2

कुछ आर्किटेक्चर के लिए, बिट स्थानांतरण गुणा करने से तेज़ है। हालांकि, इसके नमक के किसी भी कंपाइलर को बाएं बिट शिफ्ट (* थोड़ी सी शिफ्ट तेज होने पर) 2 * (या 2 की शक्ति द्वारा किसी भी गुणा द्वारा अनुकूलित) अनुकूलित किया जाएगा।

1

यदि आप पुराने सी कंपाइलर का उपयोग कर रहे हैं, तो यह bitwise का उपयोग करने के लिए प्राथमिक है। पठनीयता के लिए आप हालांकि कोड टिप्पणी कर सकते हैं।

22

जब आप गुणा कर रहे हों, और < < जब आप थोड़ा स्थानांतरित हो रहे हैं तो आपको * का उपयोग करना चाहिए। वे गणितीय रूप से समकक्ष हैं, लेकिन अलग-अलग अर्थपूर्ण अर्थ हैं। यदि आप ध्वज फ़ील्ड बना रहे हैं, उदाहरण के लिए, बिट स्थानांतरण का उपयोग करें। यदि आप कुल गणना कर रहे हैं, तो गुणा का उपयोग करें।

+0

बहुत अच्छा बिंदु। यदि आप बिट्स को एक स्थान बाईं ओर ले जाना चाहते हैं, तो '<< 1' का उपयोग करें। यदि आप संख्या को दो बार बड़ा बनाना चाहते हैं, तो '* 2' का उपयोग करें। वही प्रभाव, लेकिन आप जो संख्या का उपयोग कर रहे हैं उससे बहुत स्पष्ट है। – nickf

+2

+1। अपने कोड में अपना ** इरादा ** व्यक्त करें, दूसरे को संकलक अनुमान लगाने की कोशिश न करें (जब तक आप कोड को प्रोफाइल नहीं करते हैं और यह निर्धारित करते हैं कि यह एक तरीका है या दूसरा प्रदर्शन में महत्वपूर्ण अंतर बनाता है)। –

6

इसका उपयोग तब किया जाता है जब आप उस डेटा के व्यक्तिगत बिट्स से चिंतित होते हैं जिसके साथ आप काम कर रहे हैं। उदाहरण के लिए, आप 0x9A के लिए एक शब्द के ऊपरी बाइट सेट करना चाहते हैं, आपके द्वारा लिखी नहीं होता

n |= 0x9A * 256 

आप लिखना चाहते हैं:

n |= 0x9A << 8 

यह यह स्पष्ट है कि आप के साथ काम कर रहे हैं बनाता है बिट्स, उनके द्वारा प्रतिनिधित्व किए गए डेटा के बजाए।

2

bitfields के रूप में इस्तेमाल मूल्यों की पठनीयता के लिए:

enum Flags { UP  = (1<<0), 
      DOWN  = (1<<1), 
      STRANGE = (1<<2), 
      CHARM = (1<<3), 
      ... 

जो मुझे लगता है कि या तो '= 1, ..., = 2, ... = 4' या '= 1 बेहतर है, .. = = 2, = 2 * 2, ... = 2 * 3 'विशेष रूप से यदि आपके पास 8+ झंडे हैं।

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