入力の次の奇数を見つけるために、次のコードが使用されています。
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 を返します。
入力の次の奇数を見つけるために、次のコードが使用されています。
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 を返します。
ちょうどどうですか
b += b % 2 ^ 1;
2 で割った余りは常に 0 または 1 になるため、^
演算子 (排他的 OR) はそれを逆にします。
(また、(b & 1) ^ 1
うまくいきます。ああ、b = b ^ 1
正の整数ではうまくいくと思いますが、大きな整数では問題になります。)
質問の作者の要求で:
それを達成するための最もコンパクトな方法は
b = Math.ceil(a) | 1;
最初にを使用ceil()
して、以上の最小の整数を取得しa
、次にビット単位または1を使用して最小の奇数の整数を取得し、ceil(a)
他に何も変更せずに最後のビットが設定されるようにします。
厳密により大きい最小の奇数の整数を取得するには、次a
を使用します。
b = Math.floor(a+1) | 1;
ビット演算子はJavascriptの符号付き32ビット整数で動作するため、の値は、respa
以下である必要があります。2^31-1
2番目は厳密に小さくなります。また、a
より大きくする必要があります-2^31-1
。
符号付き整数の表現が2の補数ではなく、1の補数または符号と大きさである場合(Javascriptで許可されているかどうかはわかりませんが、Javaでは許可されていませんが、Cでは可能です)、の値は次のようにa
なります。より大きい-resp-1
の結果Math.ceil(a)
。Math.floor(a+1)
非負でなければなりません。
それほど短くはありませんが、これはより読みやすいです:
a=5.4;
b=Math.ceil(a);
b = b % 2 ? b : b + 1;
これを試して:
a = 5.4
b = Math.ceil(a)
b = b%2 == 0 ? b+1 : b
y = Math.ceil((x - 1)/2)*2 + 1
http://www.intmath.com/functions-and-graphs/graphs-using-jsxgraph.phpで fn を実行します。
それなしMath.ceil()
でそうすることができます:
b = a + a % 2 | 0 + 1;
注意。の次の奇数を と5.0
し7
ます。