检查 C 中的位 - 错误答案?

Checking bits in C - wrong answer?

我正在尝试用 C 编写一个(非常)短的代码作为修订版。

根据我的教育和其他帖子,例如;

How do you set, clear, and toggle a single bit?

下面的代码应该将值“1”放入变量 ready 中,然而,它放置了值 64。所有其他文章都指出只是放置了测试位的值,而不是简单的结果两个数字(数字和 (1 << x) )加在一起——这确实是 64!是这种情况还是我只是犯了一个错误的步骤?

uart->status |= (1<<6); //Set bit 6 to 1 

char input = 0;

int ready = (uart->status) & (1<<6); //Should mean ready = 1?, a

    if(uart->status & (1<<6) == 1) { //ready actually = 64
        input = uart->rx;
    } else {
        input = 0;
    }

非常感谢!

大卫

& 运算符执行按位与运算——即它独立地对每个位进行操作,并且 returns 在相应位置产生结果位。因此,如果第 6 位是其两个参数均为 1 的唯一位置,那么它自然会 return64。

您可能会将其行为与 && 的行为混淆(后者有效地将其输入和输出强制转换为布尔值,因此 return 为 1 或 0)。

所以你的代码中的问题纯粹是你在与值 1 进行比较。你可以改为说

if(uart->status & (1<<6) != 0)

正如 user3159253 指出的那样。甚至,当然,只是

if( uart->status & (1<<6) )

你在那里应用了按位与运算,所以你得到了与运算的值:

int ready = (uart->status) & (1<<6); // 0x00000040 & 0x00000040 = 0x00000040

你想要什么?您是否想要一个可以检查该位是否已设置的标志?如果是这样,你没问题,你可以这样做:

if (ready)
{
  // code here
}

它会起作用,因为 ready 是非零的。

if(uart->status & (1<<6) == 1)

应该是

if(uart->status & (1<<6) > 0)

当您想测试第 6 位是否已设置时。

** 编辑 **

既然你已经有了'ready'变量,那最好做

if(ready)

这是正常的。如果该位被设置,值将大于0。如果该位被清除,该值将为0。不测试它是否正好是1。