【问题标题】:Bitwise operators comparison error位运算符比较错误
【发布时间】:2013-10-22 11:14:45
【问题描述】:

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

【问题讨论】:

  • printf("%d\n", byteGetbit(test, 0x03));
  • @user1111998 你的逻辑 if(byteGetbit(test,0x03)==1)#define byteGetbit(x,y) ((x) &amp; (0x01 &lt;&lt; (y))) 总是产生不等于 1 的结果。这主要是因为左移三次显然会导致乘法,因此你的结果应该总是更大x 的所有非零正值都大于 1。

标签: c macros arm bit iar


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    ((x) &amp; (0x01 &lt;&lt; (y))) 不是逻辑运算,因此它不会产生 0 或 1 结果。在这个特定的示例中,((x) &amp; (0x01 &lt;&lt; (y))) 的结果为 0(对于 y 位在 x 中被禁用的情况,或者它导致一个二进制数只设置了位 y可以 为 1(如果 y == 0),但它不必须为 1(并且它永远不会是 y > 0 的情况)。

    如果您希望 byteGetbit 评估为 1 或 0,例如逻辑运算,您应该改用它:

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

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

    【讨论】:

      【解决方案3】:

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

      你应该把 byteGetbit 改成这样:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-07-06
        • 2019-03-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多