2011-07-12 151 views
1

我有关于位掩码中的问题,并用C位掩码和移位运算

uint32_t reg_val = 0xffffffff; 

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

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

回答

7

这是不必要的

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

现在,上面的作品,因为BIT12假定只有一个非零位。一个更通用的方式来处理这种测试将

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

这样做的原因是,第一个片段只有测试,如果reg_val AND-ED与BIT12为非零(即reg_val和BIT12至少有一个非零位共同)。第二个片段测试所有在BIT12中设置的位也在reg_val中设置。

2

右移是必要的,因为&的结果将是1<<12,而您正在比较1是1<<0

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

1

右移12是没有必要的,但它很好,因为您可以将它与1而不是4096(难以记住并且确切地告诉代码在做什么)进行比较,但由于您已经有BIT12代之以使用它是可以的。

+0

1 << 12 = 4096 :) –

+0

@迈克尔:对XD我记得当时我想:“但它基本为零,所以2〜11的动力,不要搞砸:) :)“ – Ryan

1

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