Проверка на чётность (even) и нечетность (odd) на c/c++


Метод наложения маски

Значение младшего бита (LSb, least significant bit) в числе при записи в двоичной системе счисления, однозначно определяет его чётность или нечетность:

 0 : четное число

 1 : нечетное число

Выделить бит можно наложением маски: побитовое И с числом 0b0001. Результатом будет число 0 или 1, которое при неявном преобразовании типов можно использовать в качестве условия для условного опрератора: 0 - ложь (false), 1 - истина (true).

if(i&1)     cout << i << "  - odd" << "\n";      //- нечетное
else        cout << i << "  - even"  << "\n";    //- четное

Можно оформить в виде функции:

bool isEven(int i)
{
    return !(i&1);
}

В инструкции return используется логическая операция отрицания над возвращаемым результатом для его конвертации в булевый тип (ну и чтоб результат был правильный :)

Метод работает для отрицательных знаковых целых представленных в дополнительном коде (two’s complement), т.к. после инверсии битов к числу добавляется единица. Фактически происходит двойная инверсия младшего бита и он принимает первоначальное значение (как в прямом коде).

Метод работает для отрицательных знаковых целых представленных в прямом коде (signed magnitude), где за знак отвечает старший бит числа (MSb - most significant bit). Остальные биты идентичны беззнаковому целому числу.

Метод выдаёт ошибку (прямо противоположное значение) для знаковых целых представленных в обратном коде (ones' complement), т.к. инверсия значащих бит меняет значение младшего бита на противоположное.

Начиная с C++20 для представления знаковых целых чисел может использоваться только дополнительный код (two’s complement).


Метод остатка от деления

Арифметический метод, действующий "по-определению": четное число делится на 2 без остатка. Используется оператор языка C/C++: % - остаток от деления. При делении на 2 остаток: 0 или 1 используется в качестве условия для условного опрератора: 0 - ложь (false), 1 - истина (true).

if(i%2)     cout << i << "  - odd" << "\n";      //- нечетное
else        cout << i << "  - even"  << "\n";    //- четное

Можно оформить в виде функции:

bool isEven(int i)
{
    return !(i%2);
}

Метод работает с любым представлением знаковых целых чисел (прямом, дополнительном и обратном коде), т.к. использует числа "на более высоком уровне": именно как числа а не их представление в вычислительном устройстве.