Как найти ближайший четный номер для данного int? (учитывая 11 возвращение 12)

Итак, как создать функцию для возвращения ближайшего к такому ближайшему к 9 9+ 1 заданного int, не оставляющего остатка при делении на 2 int?

Ответы

Ответ 1

"Ближайшее" неоднозначно, если задано целое число. Возьмите, скажем, 9: обе 8 и 10 четные, и они одинаково близки к нему. Если вы хотите всегда подниматься, то что-то вроде...

int nearestEvenInt(int to)
{
  return (to % 2 == 0) ? to : (to + 1);
}

Ответ 2

Чтобы округлить до ближайшего int:

number+=(number & 1)

Ответ 3

С округлением до четного

x & ~1

Раунд до четного

(x + 1) & ~1

Ответ 4

number % 2 == 0?number:number+1

Другим способом является (number>>1)<<1 , но я не уверен в негативах/little/big-endians.

Ответ 5

Обычно я предпочитаю (number+1) & ~1, но не каждый признает идиому, поэтому вам, возможно, придется подумать о своей аудитории.

В частности, если он должен работать для отрицательных целых чисел, то реализация не-двух-дополнений C и С++ не распознает идиому (она будет округлять нечетные отрицательные числа вниз, а не вверх по отрицательным знакам + номерам величин, и превращать отрицательные четные числа нечетными в их дополнение), поэтому он не полностью переносится в случае, когда разрешен отрицательный вход.

Портативный ответ (number % 2 == 0) ? number : number+1;, и пусть компилятор беспокоится об оптимизации.

Остерегайтесь также того, что вы не определили, какой результат должен быть для INT_MAX, который является нечетным, но для которого не существует большего значения int.

Ответ 6

if (x %2 == 0) return x; else return x+1;?

Ответ 7

Так как большинство ответов здесь либо не переносимы, либо имеют избыточные условные обозначения, вот быстрый и портативный ответ:

number += (int)((unsigned)number & 1)

Случай с unsigned обеспечивает побитовое и определяется как ожидаемое, а возврат возвращается к int (который хорошо определен, поскольку оба возможных значения побитового и операционного, нулевого или одного, вписываются в int) предотвращает продвижение number до unsigned, что затем приводит к реализации, определяемому реализацией, когда он преобразуется обратно в int, чтобы присвоить результат number.

Ответ 8

Немного поздно для вечеринки, но это чистое решение

n += (n % 2);

Ответ 9

Я знаю, что OP запросил int, но вот один ответ для float тоже:

number = Math.round(number * 0.5f) * 2; //Closest (up for middle)
number = Math.ceil(number * 0.5f) * 2; //Always Up
number = Math.floor(number * 0.5f) * 2; //Always Down