位掩码和移位运算符

时间:2011-07-12 23:06:02

标签: c bit-manipulation

我对C

中的位掩码和移位运算符有疑问
uint32_t reg_val = 0xffffffff;

if(1 == ((reg_val & BIT12)>>12))
{
     //DO SOMETHING.
}

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

4 个答案:

答案 0 :(得分:7)

这是不必要的

if (reg_val & BIT12)   // would be sufficient
{
     //DO SOMETHING.
}

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

if ((reg_val & BIT12) == BIT12)  
{
     //DO SOMETHING.
}

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

答案 1 :(得分:2)

正确的转变是必要的,因为&的结果将是1<<12,而您正在与1<<0进行比较。

您可以与 not 0 (即:0 !=...)进行比较,而不是与1进行比较,然后跳过右移。

答案 2 :(得分:1)

12的右移是没有必要的,但它很好,因为你可以将它与1而不是4096(更难记住并准确说出代码在做什么)进行比较,但是因为你已经{{1}已经可以使用它了。

答案 3 :(得分:1)

你当然可以写 if (0 != reg_val & BIT12) ... 要么 if (BIT12 == reg_val & BIT12) ...