是否有一个规范的解决方案来检查一个字节中的某个位是否打开,或者我应该按照我的感觉去做?有很多可能的解决方案,例如:
value = ( reg & 0x20 ) == 0x20;
value = ( reg & 0b00100000 ) == 0b00100000;
value = ( reg >> 5 ) & 1;
澄清:我不是在问更多的可能性,而是在问是否有规范的解决方案。
value = reg & 0x20
在大多数情况下就足够了,因为在 C 中任何非零值都被评估为真。
另请注意,二进制形式 like0b00100000
不是标准 C,而是某些编译器(如 gcc)中的扩展。
规范的方式是
(reg & 0x20u) > 0
文字末尾的u
确保您不对有符号数执行按位运算(如果 reg 是 char 或 short 类型,您将执行此操作)。不应混合按位运算和有符号数。
> 0
确保您以最简单的方式获得本质上是布尔类型的结果。
您可以使用双“不”使分配安全(0
或1
仅):
value = !!(reg & 0x20); // !! forces any non-zero value to 1
如果您不需要赋值(在if
, while
, for
, ... 中使用),则不需要此技巧,因为任何非零都将等于 - 条件TRUE
:
while(reg & 0x20)
通常的做法是只使用位掩码:
is5bit_on = reg & 0x20;
注意:如果只检查一位reg & 0x20
,则无需比较。0x20
尽可能避免使用幻数并使用 C99 布尔值,我会选择
enum { SOME_FLAG = 1 << 5 };
_Bool has_some_flag = reg & SOME_FLAG;