按位运算符比较错误

时间:2013-10-22 11:14:46

标签: c macros arm bit iar

编译器: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;
 }

3 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

((x) & (0x01 << (y)))不是逻辑运算,因此,它不会产生0或1结果。在此特定示例中,((x) & (0x01 << (y)))导致0(对于y中禁用位x的情况,或者导致仅设置位y的二进制数,哪个可以为1(如果是y == 0),但它 为1(并且它永远不会出现y &gt; 0)。

如果你希望byteGetbit评估为1或0,就像逻辑操作一样,你应该使用它:

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

如果在y上设置位x,则评估为1,否则为0。换句话说,它会为您提供yx位的值。

答案 2 :(得分:0)

您没有读取该位,但是将该位隔离在它的当前位置。

您应该将byteGetbit更改为:

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

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