25

我使用一个字节来存储一些标志,例如10101010,我想知道如何验证特定位是否位于1or 0

4

10 回答 10

52

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

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。因此,表达式 (value & (1 << bitindex)) 如果关联位的值是 1,则返回位掩码,如果关联位为 0,则返回 0。

最后,我们只检查结果是否为非零。(这实际上可以省略,但我想明确表示。)

于 2008-09-24T13:16:29.360 回答
6

作为Patrick Desjardins 回答的延伸:

在进行位操作时,对位运算符有非常扎实的知识真的很有帮助。

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

于 2008-09-24T13:18:00.777 回答
4

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

于 2008-09-24T13:11:45.127 回答
4

如果您喜欢像这样处理单个领域, 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) {}
  ...
}

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

于 2008-09-24T14:37:54.780 回答
3

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

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

然后您可以使用 [] 索引运算符检查和设置标志。

于 2008-09-24T14:25:07.667 回答
2

到目前为止,没有人出错,但要提供一种检查任意位的方法:

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

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

于 2008-09-24T13:20:02.783 回答
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
}
于 2008-09-24T13:14:28.473 回答
1

您可以按照Patrick Desjardins 的说法进行操作,并对前一个 AND 操作的结果进行逐位或运算。

在这种情况下,您将得到 1 或 0 的最终结果。

于 2008-09-24T13:14:46.010 回答
1

传统上,要检查是否设置了最低位,这将类似于:

int MY_FLAG = 0x0001;
if ((value & MY_FLAG) == MY_FLAG)
    doSomething();
于 2008-09-24T13:19:11.210 回答
0

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

if (var & 0x08) {
  /* The fourth bit is set */
}
于 2008-09-24T13:18:15.143 回答