Разница между (n & 1) и n & 1

0

Я пытался решить проблему Counter Game:

"Луиза и Ричард играют в игру, у них есть счетчик, на который Н. Луиза получает первый ход, а затем чередуются поочередно. В игре они выполняют следующие операции.

  • Если N не является степенью 2, они уменьшают счетчик на наибольшую мощность, равную 2 меньше N.

  • Если N является степенью 2, они уменьшают счетчик на половину N.

  • Результирующее значение представляет собой новый N, который снова используется для последующих операций.

Игра заканчивается, когда счетчик уменьшается до 1, т.е. N == 1, и последний, кто совершает действительный ход, выигрывает.

Учитывая N, ваша задача - найти победителя в игре ".

Чтобы решить вопрос, я реализовал манипуляции с битами и получил признание:

#include <iostream>
#include <cstdio>

int main() {
    long long unsigned int n, tmp;
    int cnt, t;
    scanf("%d", &t);
    while(t--) {
        scanf("%llu", &n), tmp=n;
        cnt=0;
        while(tmp) tmp&=tmp-1, cnt++;
        cnt--;
        while((n&1)==0) n>>=1, cnt++;
        if(cnt%2==0) printf("Richard\n");
        else printf("Louise\n");
    }
    return 0;
}

Тем не менее, во время кодирования я кодируется while(n&1==false) вместо while((n&1)==false), таким образом, не может получить желаемый результат. Кодирование while(!(n&1)) дало ожидаемый результат, но (!a вместо a==false) было плохой практикой из-за некоторых источников (я их забыл), которые я читал в Интернете. И я знаю разницу между while(!n&1) и while(!(n&1)), но пока не знаю while(n&1==false) и while((n&1)==false). Узнал, что последнее было и отличается, и могу ли я попросить различие, пожалуйста?

  • 1
    В чем разница между 1+2*3 и (1+2)*3 ? Здесь та же проблема.
  • 0
    использование , оператора следует избегать
Показать ещё 3 комментария
Теги:
bit-manipulation
bitwise-operators

3 ответа

4
Лучший ответ

Это рассматривается многими ошибками проектирования C.

Хотя естественно, что logical-and операция logical-and операция должны иметь более низкий приоритет, чем сравнение равенства, то одно и то же гораздо более сомнительно для bitwise-and поскольку побитовые операции, естественно, ближе к математическим операциям.

Такая же ошибка конструкции была унаследована C++ для обратной совместимости.

Хорошим правилом всегда является скобки в скобках, чтобы избежать сюрпризов.

4

Как вы можете видеть здесь, приоритет == выше приоритета &.

Поэтому n&1==false интерпретируется как n&(1==false) not (n&1)==false, поэтому вам нужны скобки.

2

== имеет более высокий приоритет в C++, чем & (источник).

Таким образом, while(n&1==false) обрабатывается как while (n & (1 == false)) которое на самом деле является while (n & 0).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню