0

是否有一个规范的解决方案来检查一个字节中的某个位是否打开,或者我应该按照我的感觉去做?有很多可能的解决方案,例如:

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

澄清:我不是在问更多的可能性,而是在问是否有规范的解决方案。

4

5 回答 5

4
value = reg & 0x20

在大多数情况下就足够了,因为在 C 中任何非零值都被评估为真。

另请注意,二进制形式 like0b00100000不是标准 C,而是某些编译器(如 gcc)中的扩展。

于 2013-09-27T06:43:17.177 回答
1

规范的方式是

(reg & 0x20u) > 0

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

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

于 2013-09-27T06:45:24.113 回答
1

您可以使用双“不”使分配安全(01仅):

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

如果您不需要赋值(在if, while, for, ... 中使用),则不需要此技巧,因为任何非零都将等于 - 条件TRUE

while(reg & 0x20)
于 2013-09-27T06:49:33.020 回答
0

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

is5bit_on = reg & 0x20;

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

于 2013-09-27T06:41:23.963 回答
0

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

enum { SOME_FLAG = 1 << 5 };
_Bool has_some_flag = reg & SOME_FLAG;
于 2013-09-27T07:29:01.963 回答