12

入力の次の奇数を見つけるために、次のコードが使用されています。

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 を返します。

4

6 に答える 6

15

ちょうどどうですか

b += b % 2 ^ 1;

2 で割った余りは常に 0 または 1 になるため、^演算子 (排他的 OR) はそれを逆にします。

(また、(b & 1) ^ 1うまくいきます。ああ、b = b ^ 1正の整数ではうまくいくと思いますが、大きな整数では問題になります。)

于 2012-06-25T17:20:13.840 に答える
11

質問の作者の要求で:

それを達成するための最もコンパクトな方法は

b = Math.ceil(a) | 1;

最初にを使用ceil()して、以上の最小の整数を取得しa、次にビット単位または1を使用して最小の奇数の整数を取得し、ceil(a)他に何も変更せずに最後のビットが設定されるようにします。

厳密により大きい最小の奇数の整数を取得するには、次aを使用します。

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

警告:

ビット演算子はJavascriptの符号付き32ビット整数で動作するため、の値は、respa以下である必要があります。2^31-12番目は厳密に小さくなります。また、aより大きくする必要があります-2^31-1

符号付き整数の表現が2の補数ではなく、1の補数または符号と大きさである場合(Javascriptで許可されているかどうかはわかりませんが、Javaでは許可されていませんが、Cでは可能です)、の値は次のようにaなります。より大きい-resp-1の結果Math.ceil(a)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.07ます。

于 2012-06-25T17:36:44.130 に答える