Следующее нечетное число в javascript

Чтобы найти следующее нечетное число для ввода, используется следующий код:

a=5.4; // Input
b=Math.ceil(a); // Required to turn input to whole number 
b=b+(((b % 2)-1)*-1); // Gives 7

Требуется функция округления округления.

Это безопасно и есть более компактный способ сделать это?

EDIT. Когда вход уже является нечетным целым числом, ничего не происходит. Например, 5.0 вернет 5

Ответ 1

При запросе автора вопроса:

Самый компактный способ его достижения -

b = Math.ceil(a) | 1;

Сначала используйте ceil(), чтобы получить наименьшее целое число, не меньшее a, затем получим наименьшее нечетное целое число, не меньшее ceil(a), выполнив поразрядное или с 1, чтобы гарантировать, что последний бит установлен без изменения чего-либо еще.

Чтобы получить наименьшее нечетное целое, строго большее a, используйте

b = Math.floor(a+1) | 1;

Предостережение:

Бит-операторы работают с подписанными 32-битными целыми числами в Javascript, поэтому значение a должно быть меньше или равно 2^31-1, соответственно. строго меньше для второго. Кроме того, a должен быть больше -2^31-1.

Если представление целых чисел со знаком не является двумя дополнениями, а дополнениями или знаками и знаками (я не знаю, допускает ли Javascript это, Java нет, но это возможность в C), значение of a должно быть больше, чем -1 - результат Math.ceil(a) соответственно. Math.floor(a+1) должен быть неотрицательным.

Ответ 2

Как насчет просто

b += b % 2 ^ 1;

Остаток после деления на 2 всегда будет 0 или 1, поэтому оператор ^ (exclusive-OR) переворачивает его на противоположное.

(Кроме того, будет работать и функция (b & 1) ^ 1. О, я думаю, b = b ^ 1 будет работать для целых положительных чисел, но это будет проблематично для больших целых чисел.)

Ответ 3

Не очень короче, но это более разборчиво:

a=5.4;
b=Math.ceil(a);
b = b % 2 ? b : b + 1;

Ответ 4

Попробуйте следующее:

a = 5.4
b = Math.ceil(a)
b = b%2 == 0 ? b+1 : b

Ответ 6

Без Math.ceil() это можно сделать так:

b = a + a % 2 | 0 + 1;

NB. Я рассматриваю следующее нечетное число 5.0 как 7.