Я хочу использовать функцию проверки четности в цикле, чтобы сделать событие, которое происходит каждый второй раз. Но все функции, которые я обнаружил для контроля четности, не работают.
Даже самые простые, как это:
unsigned int v;
bool parity = false;
while (v)
{
parity = !parity;
v = v & (v - 1);
}
Может дать мне одно и то же значение для четного числа и для нечетного числа.
Как это сделать хорошо? Или, может быть, есть ли другие способы сделать событие, которое происходит в каждом втором раунде цикла?
Похоже, вы неправильно понимаете значение слова «паритет», которое обычно используется в мире компьютеров. Код, который вы показали, устанавливает parity
в false
если двоичное представление v
имеет четное количество установленных битов и true
если он имеет нечетное количество установленных бит. Понятие паритета не имеет ничего общего с v
быть четным или нечетным само по себе. Некоторые примеры:
Number (base 10) Number (base 2) Parity
0 0 0
1 1 1
2 10 1
3 11 0
4 100 1
5 101 0
6 110 0
7 111 1
. . .
. . .
. . .
12498741 1101 1110 1101 0111 0011 0101 0
. . .
. . .
. . .
Если вы действительно хотите проверить, является ли число четным или нечетным, вы можете использовать:
bool odd = v & 1;
bool even = !(v & 1);
Которые эквивалентны %
выражение, используемое в ответе @ user1118321.
Попробуй это:
bool isEven = ((v % 2) == 0);
Это предполагает v
переменная, которую вы хотите проверить на равномерность. Это по модулю арифметики.