Проверка на чётность (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);
}
Метод работает с любым представлением знаковых целых чисел (прямом, дополнительном и обратном коде), т.к. использует числа "на более высоком уровне": именно как числа а не их представление в вычислительном устройстве.