क्या करता है "(int) मूल्य और 0x1, (int) मूल्य और 0x2, (int) मूल्य और 0x4, (int) मूल्य और 0x8" क्या मतलब है? "


11

कोड

"मान" 0 से 15 (इसके संभावित मान) तक होता है। उन 4 "अगर" शर्तों को पूरा किया जाएगा? यदि मेरा (int) मान = 2 का अर्थ 0010 है?

            if  ((int)value & 0x1) 
            {
                //statement here
            }
            if  ((int)value & 0x2) 
            {
                //statement here
            }
            if  ((int)value & 0x4) 
            {
                //statement here
            }
            if  ((int)value & 0x8) 
            {
                //statement here
            }

3
उन हैं bitmasks की अलग-अलग बिट्स के लिए जाँच value(पढ़ने if(value & 0x4)के रूप में "के 3 बिट है valueसेट (= 1))। आप उचित रूप में कोड को समझने की समस्या है के रूप में, मुझे लगता है यह आपकी नहीं है। यह (और तथ्य यह है कि आप नहीं मांग रहे हैं समीक्षा के लिए) इस प्रश्न को CR.SE के लिए ऑफ-टॉपिक बनाता है
कोई भी

बेहतर समझ के लिए, समान कोड जिसे C # में पोर्ट किया गया है Enum.HasFlag, बिट्स के परीक्षण के लिए विधि का उपयोग करेगा । देखें: Enum.HasFlag
रवांग

जवाबों:


12

प्रत्येक संख्या को value = b0*2^0 + b1*2^1 + b2*2^2 + b3*2^3 + ...प्रत्येक बी के साथ व्यक्त किया जा सकता है 0या 1(ये प्रतिनिधित्व के टुकड़े हैं)। यह बाइनरी प्रतिनिधित्व है।

बाइनरी और ( &) उन bजोड़ी में से प्रत्येक को बुद्धिमान और प्रदर्शन और उन पर ले जाता है। इसके निम्न आउटपुट हैं:

0 & 0 = 0
0 & 1 = 0
1 & 0 = 0
1 & 1 = 1

2 की शक्तियों का उपयोग करना (जिसमें केवल एक ही बिट है) हम अलग-अलग बिट्स को अलग और परीक्षण कर सकते हैं:

  • value & 1यह सच है जब valueविषम {1, 3, 5, 7, 9, 11, 13, 15} है।

  • value & 2यह सच है जब value/2विषम {2, 3, 6, 7, 10, 11, 14, 15} है।

  • value & 4सच है जब value/4विषम {4, 5, 6, 7, 12, 13, 14, 15} है।

  • value & 8सच है जब value/8विषम {8, 9, 10, 11, 12, 13, 14, 15} है।

संख्याओं पर 0x प्रीफ़ेक्स का मतलब है कि इसे हेक्साडेसिमल संख्या के रूप में व्याख्या किया जाना चाहिए । जब आप केवल 0x8 तक जाते हैं, तो यह थोड़ा बेहतर होता है, लेकिन रख-रखाव करने वालों को बताता है कि इसका उपयोग शायद एक बिटमास्क के रूप में किया जाता है।


1
शब्दांकन यह सुझाव दे सकता है कि इसे सभी संख्याओं तक बढ़ाया जा सकता है, जो सच नहीं है: 8/6विषम है, जबकि 8&6गलत फल देता है।
सोजेरड जूल

@Sjoerd यही कारण है कि मैंने कहा "2 की शक्तियां"
शाफ़्ट सनकी

5

यदि कोई विशिष्ट बिट valueसेट है, तो ये if-statement जाँचते हैं ।

0x4उदाहरण के लिए, हेक्साडेसिमल मान में सही सेट से तीसरा बिट है 1और अन्य सभी बिट्स पर सेट है 0। जब आप &दो ऑपरेटर्स के साथ बाइनरी-एंड ऑपरेटर ( ) का उपयोग करते हैं , तो परिणाम में 0उन बिट्स को छोड़कर सभी बिट सेट होंगे जो दोनों ऑपरेटर्स में 1 हैं।

इसलिए जब आप गणना करते हैं value & 0x4, तो आप या तो द्विआधारी 00000000या द्विआधारी प्राप्त 00000100करते हैं, इस पर निर्भर करता है कि 3 बिट valueहै 1या नहीं 0। पहला मूल्यांकन करता है false, और दूसरा करने के लिए true, इसलिए if-block केवल उन मानों के लिए निष्पादित किया जाता है जहां 3rd बिट सेट है।


1

यहां ध्यान देने योग्य दो दिलचस्प बातें हैं।

सबसे पहले, यह अभिन्न मूल्य के कम-क्रम 4 बिट्स में से प्रत्येक की जांच करने के लिए एक सामान्य पैटर्न है। यदि इसी शर्त को पूरा किया जाता है, तो संबंधित बिट सेट किया जाता है। मान 2 के लिए बिट पैटर्न वास्तव में 0010 है।

दूसरा और दिलचस्प सवाल यह है कि (int)कास्ट क्यों है ? C ++ में C-cast का उपयोग करने की खराब शैली के अलावा, किसी भी पूर्णांक या वर्ण मान के लिए इस कलाकार की आवश्यकता नहीं है। एक बूल का कोई मतलब नहीं है, एक डबल / फ्लोट को एक पूर्णांक अस्थायी में बदल दिया जाएगा और एक एनम का परीक्षण करने के लिए शाब्दिक मूल्यों का उपयोग करना असामान्य होगा। यह एक सूचक के साथ समझ में आता है, लेकिन यह एक बहुत ही विशेष उपयोग होगा। निष्कर्ष: कलाकारों का कोई मतलब नहीं है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.