我用一个字节来存储一些像标志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的移位测试最右边的位.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中)来检查是否设置了特定位.我还使用了两种不同的方式来制定二进制数.我强烈建议您查看上面的维基百科链接.