Как найти ближайший четный номер для данного 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