Решение состоит в том, чтобы добавить младший значащий бит к числу:
n+(n&1)
Если n
является четным, его младший бит равен 0, а число остается неизменным, как и ожидалось.
Если n
нечетно, его младший бит равен 1, а n
будет изменено на четное число непосредственно над ним.
Это основано на арифметических операциях и будет работать как для положительных, так и для отрицательных чисел.
Это даже не полагается на факт, что числа закодированы в дополнении до двух.Единственное реальное предположение состоит в том, что четные числа имеют LSB в 0, а нечетные числа - LSB в 1. Если n
кодируется необычным образом, этот метод все равно должен работать при условии, что это предположение проверено.Например, с числами, закодированными в знак-абсолютное значение, или с избыточным кодом (с избыточным четным).
Ваш метод, хотя и правильный на большинстве компьютеров, реализует ((n + 1) ÷ 2) × 2средства правой и левой смен.Но стандарты C или C ++ оставляют (на данный момент) реализацию, зависящую от значения сдвига вправо на целых числах со знаком, и ваш код может разбиваться на отрицательные числа на некоторых необычных архитектурах / компиляторах.