首页 > 解决方案 > 为什么一个复杂的位移命令不像一些具有相同逻辑的命令?

问题描述

例如,对于这些类似的代码,当我像第一个模式一样编写它时,条件为真,而在第二个模式中,条件为假。

我已经在调试器工具中实时观察了mask & (bits >> i)和的值,尽管它们相同,但条件返回 false。mask

为什么会发生这种奇怪的行为?

1:

void printLetters(unsigned int bits, unsigned int i) // 0<i<7
{
   unsigned int mask = 0x1;
   unsigned temp;

   temp = mask & (bits >> i);
   if (temp == mask) //the same condition in other way
        printf("true");
}

2:

void printLetters(unsigned int bits, unsigned int i) // 0<i<7
{
   unsigned int mask = 0x1;

   if (mask & (bits >> i)== mask) //the same condition in other way
       printf("true");`
}

标签: cbit-manipulationbytebit-shiftbits

解决方案


等号运算符的==优先级高于按位与运算符的优先级&

在第一种情况下,临时变量temp得到更正的值,连续比较给出正确的结果。

在第二个示例中,比较发生在之前,比较结果与mask.

因为比较只给出 1 或 0 分别表示真或假,如果(bits >> i)设置 0 位,结果将始终为真(带mask==0x1),否则为假。

工作代码必须使用括号来更改评估顺序,如下所示:

void printLetters(unsigned int bits, unsigned int i) // 0<i<7
{
   unsigned int mask = 0x1;

   if ( (mask & (bits >> i)) == mask) //note brackets
       printf("true");`
}

推荐阅读