位掩码和移位运算符

liv*_*hak 1 c bit-manipulation

我对C中的位掩码和移位运算符有疑问

uint32_t reg_val = 0xffffffff;

if(1 == ((reg_val & BIT12)>>12))
{
     //DO SOMETHING.
}
Run Code Online (Sandbox Code Playgroud)

其中BIT12是(1 << 12).问题是12的右移是否真的是必要的.如果不是因为如果在reg_val中设置BIT12则表达式(reg_val和BIT12)的逻辑值为'1'而如果在reg_val中清除BIT12则为'0'?从可读性的角度来看,这是一种推荐的编码实践.

mjv*_*mjv 7

这是不必要的

if (reg_val & BIT12)   // would be sufficient
{
     //DO SOMETHING.
}
Run Code Online (Sandbox Code Playgroud)

现在,上述工作原因是假设BIT12只有一个非零位.处理这种测试的更通用的方法是

if ((reg_val & BIT12) == BIT12)  
{
     //DO SOMETHING.
}
Run Code Online (Sandbox Code Playgroud)

原因是第一个片段仅测试与BIT12的reg_val AND-ed是否为非零(即reg_val和BIT12共有至少一个非零位).第二个片段测试在BIT12中设置的所有位也在reg_val中设置.