编译器: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;
}
答案 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。换句话说,它会为您提供y
上x
位的值。
答案 2 :(得分:0)
您没有读取该位,但是将该位隔离在它的当前位置。
您应该将byteGetbit更改为:
#define byteGetbit(x,y) ((x >> y) & 0x01)
这会将位移位到位0然后将其隔离。