में बिट सेटिंग कोई भी निम्नलिखित वाक्यविन्यास समझा सकता है?Ansi सी
#define Bitset(var,bitno) ((var) |=1UL<<(bitno))
मैं इसे var
के टुकड़े सेट पता है, लेकिन मैं वाक्य रचना नहीं समझ सकता।
में बिट सेटिंग कोई भी निम्नलिखित वाक्यविन्यास समझा सकता है?Ansi सी
#define Bitset(var,bitno) ((var) |=1UL<<(bitno))
मैं इसे var
के टुकड़े सेट पता है, लेकिन मैं वाक्य रचना नहीं समझ सकता।
के इसे तोड़ने के नीचे दो, टुकड़ा टुकड़ा द्वारा:
1UL
के रूप में बिट स्तर पर प्रतिनिधित्व किया 1 का मान के साथ एक unsigned long int
है:
00000000000000000000000000000001
<<
एक "बिट बदलाव" ऑपरेटर है जो उस मान में सभी बिट्स को बाईं ओर bitno
बार छोड़ देंगी।
00000000000000000000000000100000
बार जब आप इस मूल्य है, |=
(जो एक काम के साथ एक bitwise OR operation है) अनिवार्य रूप से है कि 1
के साथ कतार में है कि var
का सा होने के लिए बाध्य करेगा: यदि यह 1UL<<5
है, आप के साथ खत्म हो जाएगा एक 1
और अभ्यस्त स्पर्श किसी अन्य बिट्स (X | 0 = X
) क्योंकि
चलें कहना var
37
और bitno
7
है। तब बिट स्तर पर सब कुछ इस तरह दिखेगा:
00000000000000000000000000100101 // var
00000000000000000000000010000000 // 1UL<<7
00000000000000000000000010100101 // var | (1UL<<7)
अंत में, मामले में यह स्पष्ट नहीं है, एक function-like macro रूप #define
निशान Bitset
।
यह एक मैक्रो है। जब भी पूर्वप्रक्रमक Bitset(var,bitno)
की तरह एक बयान करता है यह ईमानदारी से
var = var | 1UL << (bitno)
इसके अलावा के साथ यह बदल देता है यह समझाने के लिए।
उल का अर्थ है असाइन किए गए लंबे।
ऑपरेटर |
bitwise OR
ऑपरेशन के लिए उपयोग किया जाता है। इसलिए चर var
OR
1UL << bitno
साथ एड और क्रम या संकलन समय कार्यक्रम की प्रकृति के आधार दौरान var
फिर वापस करने के लिए सौंपा,
कहो var
है 01000110
और bitno
5
है
तब 1UL << 5 = 32
या 00100000
तो
var = 01000110 | 00100000
यानी var = 01100110
कहो var = 8, कि बाइनरी में 0000 1000
है।
आप
8 | 16
आप क्योंकि |
ऑपरेटर बिट सेट या तो सा है अगर 1.
तो आप अपने मूल्य को |
ऑपरेटर लागू करने और कर रहे हैं, 0000 1000 | 0001 0000
जो आप 0001 1000
दे देंगे होगा करते हैं 1<<n
, जो 0000 0001
पर है n बिट्स को बाईं ओर स्थानांतरित किया गया है।
उदाहरण के लिए 1 << 3
0000 0001 << 2 = 0000 0100
है।
संक्षेप में: Bitset(8,3)
कर केवल तीसरी बिट 1 << 3
कर रही है, हो रही 0000 0100
द्वारा निर्धारित के साथ एक मुखौटा उत्पन्न होगा। यह तब "या" इस मुखौटा को 8 देगा, दे रहा है: 0000 1000 | 0000 0100
, जिसके परिणामस्वरूप 0000 1100
है, यानी, आप 8 का तीसरा बिट सेट करते हैं।
वाक्यविन्यास में पूरी तरह से अपरिहार्य सी ऑपरेटरों का समावेश होता है। इसके बारे में कुछ भी असामान्य नहीं है। आप वास्तव में क्या समझाओ? यदि आप बुनियादी सी ऑपरेटरों के अर्थ को नहीं जानते हैं, तो यह कुछ है जिसे आप * पुस्तक * में पढ़ सकते हैं। यह "सी में सामान्य अभिव्यक्ति वाक्यविन्यास की व्याख्या" के लिए जगह नहीं है। अगर आपको कुछ विशिष्ट समझने में कोई समस्या है, तो आपको यह कहना होगा कि यह क्या है। – AnT
यह एक मैक्रो है। "Var" और "bitno" के लिए मैक्रो के पोजिशनल पैरामीटर को प्रतिस्थापित करने वाले वर्णों के साथ मैक्रो नाम "बिटसेट" को बदलें। इसे बेहतर समझने के लिए अनावश्यक माता-पिता को हटा दें। –
आपको शायद ही कभी इस्तेमाल होने वाले "1UL" द्वारा फेंक दिया जा सकता है, जो कि हस्ताक्षर किए गए लंबे रूप में केवल शाब्दिक 1 है। –