比特的理性比较

时间:2015-01-30 08:14:06

标签: c++11 int bit-manipulation bit

我有一些int类型。它位于[0,255]之内。也就是说,包括8位。我需要经常检查一下:

2(int)= 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)))
{
    ...
}

但它不是很易读,是否可能 - 做某事&#34;美丽&#34;? 我不能使用std :: bitset,我的头说它浪费了资源,你不能没有它。

2 个答案:

答案 0 :(得分:3)

有两种合理的解决方案:将所有无关位设置为零,然后测试结果,或将无关位设置为1并测试结果:

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

哈罗德在评论中指出,第一种形式更为常见。这种模式很常见,编译器的优化器会识别它。

存在其他形式,但它们模糊不清:((x ^ 0x80) & 0xC0 == 0)同样有效,但不太清楚。有些ISA无法直接加载大常量,因此它们使用等效的((x>>6) & 0x3) == 0x2。不要为此烦恼,你的优化器会。

答案 1 :(得分:1)

你可以应用一些掩蔽技术,

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");