我使用一个字节来存储像10101010这样的标志,我想知道如何验证特定位是1还是0

有帮助吗?

解决方案

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

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

一点解释:

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

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

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

其他提示

作为@Daoks回答的延伸

在进行位操作时,真的有助于非常了解按位运算符

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

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 <!>”; (<!> amp;在C中)检查是否设置了特定位。我还使用了两种不同的方式来制定二进制数。我强烈建议您查看上面的维基百科链接。

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

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

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

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

如果你喜欢和像这样的个人领域一起工作,克里斯托弗·约翰逊的回答非常好。我更喜欢使用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 i.e 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 */
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top