2008-09-24 14 views

उत्तर

42

के अंतिम परिणाम होगा यहाँ एक समारोह है कि किसी भी वांछित बिट परीक्षण करने के लिए इस्तेमाल किया जा सकता है:

bool is_bit_set(unsigned value, unsigned bitindex) 
{ 
    return (value & (1 << bitindex)) != 0; 
} 

स्पष्टीकरण का एक बिट:

बाईं पारी ऑपरेटर (< <) का उपयोग थोड़ा मुखौटा बनाने के लिए किया जाता है। (< 0) 00000001 के बराबर होगा, (< 1) 00000010 के बराबर होगा, (< 3) 00001000 के बराबर होगा, इसलिए 0 की एक शिफ्ट सही बिट का परीक्षण करती है। 31 की एक शिफ्ट 32-बिट मान का बायां हिस्सा होगा।

बिटवाई-और ऑपरेटर (&) परिणाम देता है जहां दोनों किनारों पर दोनों बिट्स सेट होते हैं। उदाहरण: 1111 & 0001 = 0001; 1111 & 0010 == 0010; 0000 & 0001 = 0000 तो, अभिव्यक्ति (मूल्य & (1 < < bitindex)) bitmask वापस आ जाएगी अगर जुड़े बिट मूल्य में 1 है, या 0 वापस आ जाएगी अगर जुड़े बिट 0.

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

+0

बिटइन्डेक्स> 31 पर एक जोर देने के बारे में कैसे? – luke

+0

मुझे लगता है कि वर्तमान कार्यक्षमता, जो उस मामले में झूठी वापसी करेगी, उचित है ... –

+0

क्या यह एंडियन सुरक्षित है? – luke

4

आप एक एंड ऑपरेटर का उपयोग कर सकते हैं। उदाहरण आपके पास: 10101010 और आप तीसरे बिट आप कर सकते हैं जाँच करना चाहते हैं: (10101010 और 00100000) और यदि आप 00100000 मिल आप जानते हैं कि 1.

+0

सी में "AND" ऑपरेटर नहीं है। इसके अलावा, आपको थोड़ा सा उपयोग करने की आवश्यकता है, और तार्किक नहीं। –

1
byte THIRDBIT = 4; // 4 = 00000100 i.e third bit is set 

int isThirdBitSet(byte in) { 
return in & THIRDBIT; // Returns 1 if the third bit is set, 0 otherwise 
} 
1

आप कर सकते हैं करने के लिए तीसरे स्थान पर झंडा है जैसा कि दाओक कहते हैं और आप थोड़ा सा या पिछले और ऑपरेशन के परिणामस्वरूप थोड़ा सा करते हैं। इस मामले में आप 1 या 0.

6

@Daoks भाग होने के नाते का जवाब

जब बिट हेरफेर कर यह वास्तव में में मदद करता है bitwise operators का एक बहुत ही ठोस ज्ञान होना ।

इसके अलावा

बिटवाइज़ "और" सी में ऑपरेटर & है, इसलिए कि आप क्या करना चाहते हैं:

unsigned char a = 0xAA; // 10101010 in hex 
unsigned char b = (1 << bitpos); //Where bitpos is the position you want to check 

if(a & b) { 
    //bit set 
} 

else { 
    //not set 
} 

से ऊपर रहा कि क्या एक विशेष जांच करने के लिए बिटवाइज़ "और" (सी में &) का इस्तेमाल किया बिट सेट किया गया था या नहीं। मैंने द्विआधारी संख्याओं को तैयार करने के दो अलग-अलग तरीकों का भी उपयोग किया। मैं अत्यधिक अनुशंसा करता हूं कि आप उपरोक्त विकिपीडिया लिंक देखें।

+0

मुझे बिट्सफ़्ट की आवश्यकता क्यों है? – Pokus

+0

किसी निश्चित चर में बिट्सफ़िफ़्ट को स्टोर करने का कोई कारण नहीं है, मैं इसे बिटवाई ऑपरेटर के उदाहरण के रूप में उपयोग कर रहा था। हालांकि यदि आप बिट्सफ़िफ़्ट नहीं करते हैं तो आपको कहीं भी एक स्पष्ट मूल्य का उपयोग करना होगा। मैंने उपयोग किया गया बिट्सफ़िफ़्ट 00000100 करने का एक आसान तरीका था जहां बिट्स 2 इस उदाहरण में – mdec

0

थोड़ा सा उपयोग करें (तार्किक नहीं!) और बिटमैस्क के विरुद्ध मान की तुलना करने के लिए।

if (var & 0x08) { 
    /* the fourth bit is set */ 
} 
1

परंपरागत रूप से, अगर सबसे कम बिट सेट किया गया है जांच करने के लिए यह कुछ दिखेगा की तरह:

int MY_FLAG = 0x0001; 
if ((value & MY_FLAG) == MY_FLAG) 
    doSomething(); 
+0

है जो परीक्षण करता है कि एक विशिष्ट बिट * और केवल वह बिट * सेट है। –

+2

नहीं यह नहीं ... –

+0

हार्डकोड मत करो! –

2

कोई भी गलत अब तक हो गया है, लेकिन एक मनमाना बिट की जांच करने के लिए एक विधि देने के लिए:

int checkBit(byte in, int bit) 
{ 
    return in & (1 << bit); 
} 

यदि फ़ंक्शन गैर-शून्य लौटाता है, तो बिट सेट हो जाता है।

4

आप सी ++ का उपयोग कर रहे और मानक पुस्तकालय की अनुमति दी है, मैं एक bitset में अपने झंडे के भंडारण के सुझाव देंगे:

#include <bitset> 
//... 
std::bitset<8> flags(someVariable); 

तो जैसा कि आप की जाँच करें और [] अनुक्रमण ऑपरेटर का उपयोग झंडे सेट कर सकते हैं।

4

क्रिस्टोफर जॉनसन का जवाब बहुत अच्छा है यदि आप इस तरह के व्यक्तिगत क्षेत्रों के साथ काम करना पसंद करते हैं। मैं सी

में बिट फ़ील्ड का उपयोग कर उदाहरण के लिए द्वारा कोड पढ़ने में आसान बनाने के लिए पसंद करते हैं:

struct fieldsample 
{ 
    unsigned short field1 : 1; 
    unsigned short field2 : 1; 
    unsigned short field3 : 1; 
    unsigned short field4 : 1; 
} 

यहाँ आप चार क्षेत्रों, आकार में प्रत्येक 1 बिट के साथ एक सरल struct है। फिर आप सरल संरचना पहुंच का उपयोग करके अपना कोड लिख सकते हैं।

void codesample() 
{ 
    //Declare the struct on the stack. 
    fieldsample fields; 
    //Initialize values. 
    fields.f1 = 1; 
    fields.f2 = 0; 
    fields.f3 = 0; 
    fields.f4 = 1; 
    ... 
    //Check the value of a field. 
    if(fields.f1 == 1) {} 
    ... 
} 

आपको एक ही छोटा आकार का लाभ, साथ ही पठनीय कोड मिलता है क्योंकि आप संरचनाओं के अंदर अपने क्षेत्र सार्थक नाम दे सकते हैं।

+0

ध्यान दें कि बिट फ़ील्ड का उपयोग करने में समस्या यह है कि जिस तरह से वे स्मृति में रखे गए हैं, कार्यान्वयन-निर्भर है, इसलिए उन अन्य डेटा के साथ उनका उपयोग करना मुश्किल हो सकता है। –

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