javascript中的下一个奇数

zaf*_*zaf 11 javascript algorithm math

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

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

细胞舍入功能是必需的.

这是安全的吗?有更紧凑的方法吗?

编辑:当输入已经是一个奇数整数时,没有任何反应.例如5.0将返回5

Poi*_*nty 14

怎么样

b += b % 2 ^ 1;
Run Code Online (Sandbox Code Playgroud)

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

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

  • 咦?@Esailija如果`b`为零,则下一个奇数是1.它不应该继续查找后续的奇数,或者至少我没有在OP中看到任何指示. (2认同)

Dan*_*her 9

在提问者的要求下:

实现它的最紧凑的方法是

b = Math.ceil(a) | 1;
Run Code Online (Sandbox Code Playgroud)

首先使用ceil()获得不小于的最小整数a,然后获得不小于ceil(a)通过按位或小于1的最小奇数,以确保最后一位被设置而不改变任何其他内容.

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

b = Math.floor(a+1) | 1;
Run Code Online (Sandbox Code Playgroud)

注意事项:

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

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


gpo*_*ojd 6

不是很短,但这更清晰:

a=5.4;
b=Math.ceil(a);
b = b % 2 ? b : b + 1;
Run Code Online (Sandbox Code Playgroud)