0

编译器:IAR 平台:stm32f4

我有这个代码,但它没有按预期工作。有人可以解释我为什么?

#define byteGetbit(x,y) ((x) & (0x01 << (y)))

volatile t_uint8 test=0xFF;
if(byteGetbit(test,0x03)==1){ //always false
   printf("hello"); //can't reach the code here
   test = 0;
}

解决方法:

if(byteGetbit(test,0x03)){
   printf("hello");
   test = 0;
 }
4

3 回答 3

2

byteGetbit产生一个具有相应位设置或清除的值,因此要测试位设置,您必须检查:

if(byteGetbit(test,0x03) == 0x03)

或者

if(byteGetbit(test,0x03))  // test if byteGetbit(test,0x03) != 0
于 2013-10-22T11:18:29.783 回答
1

((x) & (0x01 << (y)))不是逻辑运算,因此,它不会产生 0 或 1 结果。在此特定示例中,((x) & (0x01 << (y)))结果为 0(对于在y中禁用该位的情况x,或者它导致仅y设置位的二进制数,可以为 1(如果y == 0),但不必1(并且它从来不是这样的情况y> 0) 的情况。

如果你想byteGetbit评估为 1 或 0,比如逻辑运算,你应该使用它来代替:

#define byteGetbit(x,y) (((x) & (0x01 << (y))) ? 1 : 0)

如果 bity设置为 on x,这将评估为 1,否则评估为 0。换句话说,它为您提供了on 的y第 -th 位的值x

于 2013-10-22T11:30:24.997 回答
0

您不读取该位,但您在其当前位置隔离该位。

您应该将 byteGetbit 更改为:

#define byteGetbit(x,y) ((x >> y) & 0x01)

这会将位移至位 0,然后将其隔离。

于 2013-10-22T21:17:05.047 回答