规范方法检查C中是否有一个位?

时间:2013-09-27 06:37:49

标签: c bit

是否有规范的解决方案来检查字节中的某个位是否打开,或者我应该按照我的意思执行操作?有很多可能的解决方案,例如:

value = ( reg & 0x20 ) == 0x20;
value = ( reg & 0b00100000 ) == 0b00100000;
value = ( reg >> 5 ) & 1;

澄清:我没有询问更多可能性,但是否有规范解决方案。

5 个答案:

答案 0 :(得分:4)

value = reg & 0x20
在大多数情况下,

就足够了,因为在C中任何非零值都会被评估为真。

另请注意,像0b00100000这样的二进制表单不是标准C,而是某些编译器(如gcc)的扩展。

答案 1 :(得分:1)

规范的方式是

(reg & 0x20u) > 0

文字末尾的u确保您不对带符号的数字执行按位操作(如果reg类型为char或short,则将执行此操作)。按位运算和带符号的数字不应混用。

> 0以最简单的方式确保您的结果基本上是布尔类型。

答案 2 :(得分:1)

您可以使用双“不”来确保安全(仅01

value = !!(reg & 0x20); // !! forces any non-zero value to 1

如果您不需要分配(ifwhilefor,......),则不需要此技巧,因为任何非零将等于{ {1}} - 条件:

TRUE

答案 3 :(得分:0)

通常的做法就是使用位掩码:

is5bit_on = reg & 0x20;

注意:如果只检查一位,则无需将reg & 0x200x20进行比较。

答案 4 :(得分:0)

尽可能避免使用C99布尔值,我会选择

enum { SOME_FLAG = 1 << 5 };
_Bool has_some_flag = reg & SOME_FLAG;