c++11 बिट्स के तर्कसंगत तुलना




int bit-manipulation (2)

मेरे पास बहुत से प्रकार के इंट हैं I यह [0,255] के भीतर है यही है, 8 बिट्स भी शामिल है मुझे अक्सर यह कहना पड़ता है कि:

2 (इंट) = 00000010 (बाइनरी)

  1. The bit 6 and bit 7 must be equal to 0 and 1 respectively. 
  And I check it like this:
if ((!(informationOctet_ & (1 << 6))) && (informationOctet_ & (1 << 7)))
{
    ...
}

लेकिन यह बहुत पठनीय नहीं है, क्या यह संभव है - कुछ "सुंदर" करना है? मैं std :: bitset का उपयोग नहीं कर सकता, मेरे सिर का कहना है कि यह संसाधनों की बर्बादी है और आप इसके बिना नहीं कर सकते।


दो उचित समाधान हैं: या तो सभी न करें-देखभाल बिट्स को शून्य पर सेट करें, और फिर परिणाम की जांच करें, या न करें-परवाह करें बिट्स को एक पर सेट करें और नतीजे का परीक्षण करें:

(x & 0xC0) == 0x80
(x | ~0xC0) == ~0x40

जैसा कि हेरोल्ड ने टिप्पणी में बताया, पहला रूप बहुत अधिक आम है। यह पैटर्न इतना आम है कि आपके कंपाइलर के अनुकूलक इसे पहचान लेंगे।

अन्य रूप मौजूद हैं, लेकिन वे अस्पष्ट हैं: ((x ^ 0x80) & 0xC0 == 0) ठीक ही काम करता है लेकिन कम स्पष्ट है। कुछ ISA बड़े स्थिरांक सीधे नहीं लोड कर सकते हैं, इसलिए वे ((x>>6) & 0x3) == 0x2 के समतुल्य का उपयोग करते हैं। इस के साथ परेशान मत करो, आपका अनुकूलक होगा


आप कुछ मास्किंग तकनीकों को लागू कर सकते हैं,

int i = 246; // Lets say any value.
int chk = ( i & 00000110b ); // eliminates all other bits except 6th & 7th bit
if (chk == 2) // because we want to check 6th bit is 0 & 7th is 1, that becomes 2 value in decimal
    printf("The 6th bit is 0 & 7th bit is 1");
else
    printf("Either 6th bit is not 0 or 7th bit is not 1, or both are not 0 & 1 respectivly");




bit