c - 位掩码和移位运算符

标签 c bit-manipulation

我有一个关于 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/

相关文章:

java - f(int x) { 返回 x == 0 ? 0 : 1; } in Java without conditionals

c - 按位取反检查

mysql - 在 MySQL 中存储二进制字符串

c - 指向局部指针数组的全局指针

c - 使用符合 C89 标准的 M_PI

c - Hook 在终端上。我可以在终端中运行命令之前调用方法吗?

c - 我应该怎么做才能消除此错误消息?

将指针复制到指针并复制结构

c - c中的位操作

c++ - 将整数乘以适当分数的快速方法,无需 float 或溢出