为什么一个复杂的位移命令不像某些具有相同逻辑的命令那样起作用?

Why does one complex bits-shifting command not act like some commands with the same logic?

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

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

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

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");`
}

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

在第一种情况下,临时变量 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");`
}