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

时间:2015-01-15 21:06:01

标签: c bit logical-operators

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

根据我的教育和其他职位,如;

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

以下代码应将值“1”放入变量ready中,然而,它将值64放置。所有其他文章都表明只放置测试位的值,而不仅仅是两者的结果数字(数字和(1 <&lt; 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;
    }

非常感谢!

大卫

4 个答案:

答案 0 :(得分:4)

&运算符执行按位AND运算,即。它在每个位上独立运行,并返回相应位置的结果位。因此,如果第6位是其参数均为1的唯一位置,那么它自然会返回64。

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

因此,您的代码中的问题纯粹是您要与值1进行比较。您可以改为说

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

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

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

答案 1 :(得分:2)

您在那里应用了按位AND操作,因此您获得了AND&#39; ed值:

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

你想要什么?你想要一个标志,你可以检查是否设置了该位?如果是这样,你可以,你可以这样做:

if (ready)
{
  // code here
}

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

答案 2 :(得分:1)

该行

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

应该是

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

当你想测试是否设置了第6位时。

**编辑**

由于你已经有'ready'变量,所以最好做

if(ready)

答案 3 :(得分:0)

这是应该的。如果该位置1,则该值将大于0.如果该位清零,则该值将为0.不测试它是否恰好为1.