2013-01-22 14 views
7

में बिट सेटिंग कोई भी निम्नलिखित वाक्यविन्यास समझा सकता है?Ansi सी

#define Bitset(var,bitno) ((var) |=1UL<<(bitno)) 

मैं इसे var के टुकड़े सेट पता है, लेकिन मैं वाक्य रचना नहीं समझ सकता।

+1

वाक्यविन्यास में पूरी तरह से अपरिहार्य सी ऑपरेटरों का समावेश होता है। इसके बारे में कुछ भी असामान्य नहीं है। आप वास्तव में क्या समझाओ? यदि आप बुनियादी सी ऑपरेटरों के अर्थ को नहीं जानते हैं, तो यह कुछ है जिसे आप * पुस्तक * में पढ़ सकते हैं। यह "सी में सामान्य अभिव्यक्ति वाक्यविन्यास की व्याख्या" के लिए जगह नहीं है। अगर आपको कुछ विशिष्ट समझने में कोई समस्या है, तो आपको यह कहना होगा कि यह क्या है। – AnT

+0

यह एक मैक्रो है। "Var" और "bitno" के लिए मैक्रो के पोजिशनल पैरामीटर को प्रतिस्थापित करने वाले वर्णों के साथ मैक्रो नाम "बिटसेट" को बदलें। इसे बेहतर समझने के लिए अनावश्यक माता-पिता को हटा दें। –

+0

आपको शायद ही कभी इस्तेमाल होने वाले "1UL" द्वारा फेंक दिया जा सकता है, जो कि हस्ताक्षर किए गए लंबे रूप में केवल शाब्दिक 1 है। –

उत्तर

13

के इसे तोड़ने के नीचे दो, टुकड़ा टुकड़ा द्वारा:

1UL के रूप में बिट स्तर पर प्रतिनिधित्व किया 1 का मान के साथ एक unsigned long int है:

00000000000000000000000000000001 

<< एक "बिट बदलाव" ऑपरेटर है जो उस मान में सभी बिट्स को बाईं ओर bitno बार छोड़ देंगी।

00000000000000000000000000100000 

बार जब आप इस मूल्य है, |= (जो एक काम के साथ एक bitwise OR operation है) अनिवार्य रूप से है कि 1 के साथ कतार में है कि var का सा होने के लिए बाध्य करेगा: यदि यह 1UL<<5 है, आप के साथ खत्म हो जाएगा एक 1 और अभ्यस्त स्पर्श किसी अन्य बिट्स (X | 0 = X) क्योंकि

चलें कहना var37 और bitno7 है। तब बिट स्तर पर सब कुछ इस तरह दिखेगा:

00000000000000000000000000100101 // var 
00000000000000000000000010000000 // 1UL<<7 

00000000000000000000000010100101 // var | (1UL<<7) 

अंत में, मामले में यह स्पष्ट नहीं है, एक function-like macro रूप #define निशान Bitset

2

यह एक मैक्रो है। जब भी पूर्वप्रक्रमक Bitset(var,bitno) की तरह एक बयान करता है यह ईमानदारी से

var = var | 1UL << (bitno) 

इसके अलावा के साथ यह बदल देता है यह समझाने के लिए।

उल का अर्थ है असाइन किए गए लंबे

ऑपरेटर |bitwise OR ऑपरेशन के लिए उपयोग किया जाता है। इसलिए चर varOR 1UL << bitno साथ एड और क्रम या संकलन समय कार्यक्रम की प्रकृति के आधार दौरान var

फिर वापस करने के लिए सौंपा,

कहो var है 01000110 और bitno5 है

तब 1UL << 5 = 32 या 00100000

तो

var = 01000110 | 00100000 

यानी var = 01100110

+3

कोड को फिर से लिखने से प्रश्न का उत्तर कैसे मिलता है? – nico

+0

@ निको मैं बस दूसरों के साथ प्रतिस्पर्धा कर रहा हूं। –

+0

पता नहीं था कि यह एक प्रतियोगिता थी – nico

0

कहो var = 8, कि बाइनरी में 0000 1000 है।

आप

8 | 16 आप क्योंकि | ऑपरेटर बिट सेट या तो सा है अगर 1.

तो आप अपने मूल्य को | ऑपरेटर लागू करने और कर रहे हैं, 0000 1000 | 0001 0000 जो आप 0001 1000 दे देंगे होगा करते हैं 1<<n, जो 0000 0001 पर है n बिट्स को बाईं ओर स्थानांतरित किया गया है।

उदाहरण के लिए 1 << 30000 0001 << 2 = 0000 0100 है।

संक्षेप में: Bitset(8,3) कर केवल तीसरी बिट 1 << 3 कर रही है, हो रही 0000 0100 द्वारा निर्धारित के साथ एक मुखौटा उत्पन्न होगा। यह तब "या" इस मुखौटा को 8 देगा, दे रहा है: 0000 1000 | 0000 0100, जिसके परिणामस्वरूप 0000 1100 है, यानी, आप 8 का तीसरा बिट सेट करते हैं।