检查 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。
我正在尝试用 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。