12

要查找输入的下一个奇数,请使用以下代码:

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

需要 ceil 舍入函数。

这是否安全,是否有更紧凑的方法来做到这一点?

编辑:当输入已经是奇数时,什么也不会发生。例如 5.0 将返回 5

4

6 回答 6

15

刚刚怎么样

b += b % 2 ^ 1;

除以 2 后的余数将始终为 0 或 1,因此^运算符(异或)将其翻转为相反的。

(另外,(b & 1) ^ 1也可以。哦,我想b = b ^ 1它适用于正整数,但对于大整数会有问题。)

于 2012-06-25T17:20:13.840 回答
11

应问题作者的要求:

实现它的最紧凑的方法是

b = Math.ceil(a) | 1;

先用ceil()求取不小于 的最小整数a,再取不小于 的最小奇整数ceil(a),逐位或用 1 确保最后一位被设置,不做任何改变。

要获得严格大于 的最小奇整数a,请使用

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

注意事项:

位运算符在 Javascript 中对带符号的 32 位整数进行操作,因此 的值a必须小于或等于2^31-1, 和 。第二个严格更小。此外,a必须大于-2^31-1

如果有符号整数的表示不是二进制补码,而是二进制补码或符号和大小(我不知道 Javascript 是否允许,Java 不允许,但它在 C 中是可能的),值a必须是大于-1- Math.ceil(a)resp 的结果。Math.floor(a+1)必须是非负的。

于 2012-06-26T13:41:06.367 回答
6

不是很短,但这更清晰:

a=5.4;
b=Math.ceil(a);
b = b % 2 ? b : b + 1;
于 2012-06-25T17:24:06.613 回答
3

试试这个:

a = 5.4
b = Math.ceil(a)
b = b%2 == 0 ? b+1 : b
于 2012-06-25T17:23:16.110 回答
2
y = Math.ceil((x - 1)/2)*2  + 1

在http://www.intmath.com/functions-and-graphs/graphs-using-jsxgraph.php上执行 fn

于 2012-06-25T17:25:49.767 回答
1

没有Math.ceil()它可以这样做:

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

注意。我认为下一个奇数5.0as 7

于 2012-06-25T17:36:44.130 回答