我有一个关于 C 中的位掩码和移位运算符的问题
uint32_t reg_val = 0xffffffff;
if(1 == ((reg_val & BIT12)>>12))
{
//DO SOMETHING.
}
其中 BIT12 是 (1 <<12)。 问题是右移12位是否真的有必要。如果不是,是因为如果reg_val中设置了BIT12,则表达式(reg_val&BIT12)的逻辑值为'1',如果reg_val中清除了BIT12,则表达式的逻辑值为'0'?也是从可读性的角度进行转变是一种推荐的编码做法。?
最佳答案
这是不必要的
if (reg_val & BIT12) // would be sufficient
{
//DO SOMETHING.
}
现在,上面的代码起作用了,因为假定 BIT12 只有一个非零位。处理这种测试的更通用的方法是
if ((reg_val & BIT12) == BIT12)
{
//DO SOMETHING.
}
这样做的原因是,第一个代码片段仅测试 reg_val 与 BIT12 的 AND 运算是否为非零(即 reg_val 和 BIT12 至少有一个共同的非零位)。第二个片段测试在 BIT12 中设置的所有位也在 reg_val 中设置。
关于c - 位掩码和移位运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6672283/