我对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'?从可读性的角度来看,这也是推荐的编码实践。
答案 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) ...