Почему одна сложная команда сдвига битов не действует как некоторые команды с одинаковой логикой? - PullRequest
0 голосов
/ 10 июня 2018

Например, для этих похожих кодов, когда я пишу его как первый шаблон, условие становится истинным, а во втором шаблоне условие становится ложным.

Я наблюдал значения 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");`
}

1 Ответ

0 голосов
/ 11 июня 2018

Оператор равенства == имеет более высокий приоритет, чем оператор побитового оператора И &.

В первом случае временная переменная temp получает исправленное значение, а последовательное сравнение дает правильный результат.

Во втором примере сравнение происходит раньше, чем результат сравнения аннулируется по битам с mask.

Поскольку сравнение дает только 1 или 0 для true или false соответственно, еслибит 0 в (bits >> i) установлен, результат всегда будет истинным (с 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");`
}
...