Я пытался решить проблему 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)
. Узнал, что последнее было и отличается, и могу ли я попросить различие, пожалуйста?
Это рассматривается многими ошибками проектирования C.
Хотя естественно, что logical-and
операция logical-and
операция должны иметь более низкий приоритет, чем сравнение равенства, то одно и то же гораздо более сомнительно для bitwise-and
поскольку побитовые операции, естественно, ближе к математическим операциям.
Такая же ошибка конструкции была унаследована C++ для обратной совместимости.
Хорошим правилом всегда является скобки в скобках, чтобы избежать сюрпризов.
Как вы можете видеть здесь, приоритет ==
выше приоритета &
.
Поэтому n&1==false
интерпретируется как n&(1==false)
not (n&1)==false
, поэтому вам нужны скобки.
==
имеет более высокий приоритет в C++, чем &
(источник).
Таким образом, while(n&1==false)
обрабатывается как while (n & (1 == false))
которое на самом деле является while (n & 0)
.
1+2*3
и(1+2)*3
? Здесь та же проблема.,
оператора следует избегать