我使用一个字节来存储一些标志,如 10101010
,我想知道如何验证特定的位是 1
还是 0
。
我使用一个字节来存储一些标志,如 10101010
,我想知道如何验证特定的位是 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
进行的位移测试最右边的位。 32 位值的最左边的位将使用31
位移。
按位与运算符 (&
) 的结果是:两侧所有位上均为1
的位都被设置为1
。示例:
1111 & 0001
等于 0001
1111 & 0010
等于 0010
0000 & 0001
等于 0000
(value & (1 << bitindex))
如果相关位(bitindex
)在该位置包含1
,则返回位掩码;否则,将返回0
(意味着在相关的bitindex
位置上不包含1
)。
简单来说,该表达式检测结果是否大于零
。
Result > 0
返回true
,表示字节在测试的bitindex
位置上有一个1
。false
,这意味着结果为零,这意味着在测试的bitindex
位置上有一个0
。请注意,由于它是布尔值,因此语句中不需要!= 0
,但我喜欢明确指出。
&
,因此您需要执行以下操作: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运算符。例如,您有一个数字10101010,想要检查第三位,您可以执行以下操作:(10101010 AND 00100000)。如果您得到00100000,则表示在第三个位置上的标志位为1。
Kristopher Johnson的答案非常好,如果你喜欢像这样处理单个字段。我更喜欢在C中使用位域(bit fields)来使代码更易于阅读。
例如:
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) {}
...
}
如果您正在使用C++,并且允许使用标准库,我建议将标志存储在位集中:
#include <bitset>
//...
std::bitset<8> flags(someVariable);
这样你就可以使用[]索引运算符来检查和设置标志。
到目前为止还没有人出错,但是为了提供一个检查任意位的方法:
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
}
传统上,要检查最低位是否设置,代码通常会像这样:
int MY_FLAG = 0x0001;
if ((value & MY_FLAG) == MY_FLAG)
doSomething();
if (var & 0x08) {
/* The fourth bit is set */
}