如何检查我的字节标志?

我使用一个字节来存储一些标志,如10101010 ,我想知道如何validation特定位是1还是0

这是一个可用于测试任何所需位的函数:

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

一点解释:

左移位运算符(<<)用于创建位掩码。 (1 << 0)将等于00000001,(1 << 1)将等于00000010,(1 << 3)将等于00001000等。因此0的移位测试最右边的位。 31的偏移将是32位值的最左边的位。

按位运算符(&)给出一个结果,其中两侧的所有位都设置为1。 示例:1111和0001 = 0001; 1111&0010 == 0010; 0000&0001 = 0000.因此,如果相关位的值为1,则表达式(值&(1 << bitindex))将返回位掩码,或者如果相关位为0,则返回0。

最后,我们只检查结果是否为非零。 (这实际上可以省略,但我喜欢说明一点。)

作为@Daoks答案的延伸

在进行位操作时, 确实对位运算符有非常扎实的了解。

C中的按位“AND”运算符也是& ,所以你想要做的是:

 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 } 

在上面,我使用按位“AND”(&在C中)来检查是否设置了特定位。 我还使用了两种不同的方式来制定二进制数。 我强烈建议您查看上面的维基百科链接。

您可以使用AND运算符。 示例你有:10101010并且你要检查你可以做的第三位:(10101010 AND 00100000)如果你得到00100000你知道你在第三个位置的标志为1。

如果您使用C ++并且允许使用标准库,我建议将您的标志存储在bitset中:

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

然后你可以使用[]索引操作符检查和设置标志。

如果你喜欢和像这样的个别领域一起工作,Kristopher Johnson的答案非常好。 我更喜欢使用C中的位字段使代码更容易阅读。

例如:

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

这里有一个简单的结构,有四个字段,每个字段大小为1位。 然后,您可以使用简单的结构访问编写代码。

 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) {} ... } 

您可以获得相同的小尺寸优势以及可读代码,因为您可以在结构中为字段指定有意义的名称。

到目前为止没有人错,但是要给出一个检查任意位的方法:

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

如果函数返回非零,则设置该位。

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

你可以像Daok所说的那样做,你对前一个AND操作的结果做了一点OR。 在这种情况下,您将得到1或0的最终结果。

传统上,要检查是否设置了最低位,这将看起来像:

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

使用按位(非逻辑!)并将值与位掩码进行比较。

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