2010-12-05 6 views
15

したがって、2の整数で除算されたときに余りを残さずに与えられたintに9 9+ 1の最も近いものを返す関数を作成する方法は?与えられたintに最も近い偶数を見つける方法は? (与えられた11のリターン12)

+10

きれいなソリューションです。一意に指定されます。 10は12に近い11に近いです。あなたはどれが欲しいですか?そして負の数値はどうですか?そして、入力積分または浮動小数点ですか? –

+0

@David:入力は明らかに積分的ですが、残りのコメントは+1です – Cameron

+0

答えがない質問に対しては、すべて投票済みの回答があるとは思えません! –

答えて

14

整数が指定されている場合、「最近」はあいまいです。例えば、9を取る:8と10の両方が偶数であり、それと等しく近い。あなたは常に最新に行きたい場合は、何かのような...

int nearestEvenInt(int to) 
{ 
    return (to % 2 == 0) ? to : (to + 1); 
} 
+0

エラーC2143が発生します... – Rella

+15

"エラーC2143が発生します... "... * Tシャツ。 –

+0

このコードを書く前に、 "私のコンパイラのオプティマイザが除算と分岐を削除すると信じています" – Abyx

11

number % 2 == 0?number:number+1

もう一つの方法は、(number>>1)<<1ですが、私はネガ/リトル/ビッグエンディアンについてはよく分かりません。

+0

'(number >> 1)<< 1'は負の値のUBを持ちます。 ( '' ''のみ '' 'は実装定義ですが、' << 'は未定義です;それは符号付きの算術オーバーフローです) –

4

if (x %2 == 0) return x; else return x+1;

39

は、最寄りのint型に切り上げるには:

number+=(number & 1) 
+1

ビットライズのためのホレイ! – GWW

+7

+1は賢明、-1は可読性のため;-) – Cameron

+6

数字が偶数であるかどうかをチェックするためにモジュロを使用しない場合は+1。 – GolezTrol

31

ラウンド上下でも

x & ~1 

ラウンドまでにも、

(x + 1) & ~1 
+3

(注:ここでの回答のほとんどとは異なり、これは切り上げられるのではなく) –

+0

@Michael Mrozekご挨拶ありがとうございます – Abyx

+0

明確で、効率的で、簡潔で網羅的です。 OPが指定されていない、または指定されていないので、これは間違いなく最高の答えです。 – Tim

8

私は通常(number+1) & ~1ある好む方法、 しかし誰もがそのイディオムを認識しているわけではないので、あなたのaudi ence。

特に負の整数の場合、CとC++の非2の補数の実装ではイディオムは認識されません(負の符号+絶対値の代わりに奇数の負の数値が下がります、負の奇数を1の補数で奇数にする)ので、負の入力が許可されている場合には完全に移植可能ではありません。

移植性のある回答は(number % 2 == 0) ? number : number+1;であり、コンパイラが最適化を心配するようにします。

INT_MAXの結果が何であるかは定義されていないことに注意してください。これは奇数ですが、さらに大きな値のintもありません。

+0

もう一つの "可搬性"の可能性はC99では正の無限大と負の無限大に向かって正の値を丸める 'number +(number%2)'です。 – caf

+0

0から丸めたい場合は、カフェの答えが最適です。しかし、丸めたい場合は、 '&'や厄介な条件文を使う必要があります。 –

3

ここでの回答のほとんどは、移植性や過剰条件文を持っているのどちらかであるので、ここでは、迅速かつポータブル答えは:unsigned

number += (int)((unsigned)number & 1) 

場合は、予想通り、ビット単位-とが定義されていることを保証し、そしてキャストint(ビット単位の可能な値と0または1の両方の可能な値がintに収まるため、明確に定義されています)がunsignedに昇格するのを防ぎます。この結果、int結果をnumberに割り当てます。

私はOPがintを求めたが、ここではフロートのための1つの答えはあまりにも知っている
1

number = Math.round(number * 0.5f) * 2; //Closest (up for middle) 
number = Math.ceil(number * 0.5f) * 2; //Always Up 
number = Math.floor(number * 0.5f) * 2; //Always Down 
2

を少し遅れてパーティーに、これは、この問題ではない

n += (n % 2); 
関連する問題