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