Проверка четности в десятичном формате

Я хочу использовать функцию проверки четности в цикле, чтобы сделать событие, которое происходит каждый второй раз. Но все функции, которые я обнаружил для контроля четности, не работают.

Даже самые простые, как это:

unsigned int v;
bool parity = false;

while (v)
{
parity = !parity;
v = v & (v - 1);
}

Может дать мне одно и то же значение для четного числа и для нечетного числа.

Как это сделать хорошо? Или, может быть, есть ли другие способы сделать событие, которое происходит в каждом втором раунде цикла?

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.

8

Другие решения

Попробуй это:

bool isEven = ((v % 2) == 0);

Это предполагает v переменная, которую вы хотите проверить на равномерность. Это по модулю арифметики.

3

По вопросам рекламы [email protected]