我正在尝试用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;
}
非常感谢!
大卫
答案 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.