Как найти ближайшее четное число для данного int?(дано 11, возврат 12) - PullRequest
15 голосов
/ 05 декабря 2010

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

Ответы [ 9 ]

41 голосов
/ 05 декабря 2010

Округлить до ближайшего целого:

number+=(number & 1)
31 голосов
/ 05 декабря 2010

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

x & ~1

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

(x + 1) & ~1
15 голосов
/ 05 декабря 2010

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

int nearestEvenInt(int to)
{
  return (to % 2 == 0) ? to : (to + 1);
}
11 голосов
/ 05 декабря 2010

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

Другой способ - (number>>1)<<1 , но я не уверен насчет негативов / маленьких / старших чисел.

8 голосов
/ 05 декабря 2010

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

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

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

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

4 голосов
/ 05 декабря 2010

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

3 голосов
/ 05 апреля 2017

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

n += (n % 2);
3 голосов
/ 06 декабря 2010

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

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

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

2 голосов
/ 06 апреля 2014

Я знаю, что операционная система запрашивала int, но вот еще один ответ для чисел с плавающей запятой:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...