2010-12-05 68 views
15

那麼如何創建一個函數來返回最接近9 9+ 1給予int最大值留下沒有餘數除以2 int?如何找到最接近的偶數給定的int? (給定11返回12)

+10

這個問題是不是唯一指定。 10和12一樣接近11。你想要哪一個?那麼負數呢?並且是輸入積分還是浮點? – 2010-12-05 18:15:38

+0

@大衛:輸入顯然是不可或缺的,但對於您的其他評論來說,+1 +1 – Cameron 2010-12-05 18:17:47

+0

我無法相信有沒有答案的問題的所有答案都是最新的! – 2010-12-05 18:55:11

回答

14

給定整數時,「最近」是不明確的。比如說9:8和10都是偶數,並且都接近於它。如果你想一直往上走,那麼像...

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

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

另一種方式是(number>>1)<<1但我不知道底片/小/大endians。

+0

`(數字>> 1)<< 1`具有負值的UB。 (`>>`只是實現定義的,但`<<`未定義;它是一個有符號的算術溢出) – 2010-12-06 05:42:50

4

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

39

舍入到最近的INT:

number+=(number & 1) 
31

回合下來,甚至

x & ~1 

回合最多甚至

(x + 1) & ~1 
8

我通常喜歡是(number+1) & ~1的方式, 不是每個人都認識這個成語,所以你可能不得不考慮你的audi ENCE。

特別是,如果它應該用於負整數,那麼C和C++的非二補補實現將不會識別該成語(它會將奇數負數向下舍入,而不是負號+數量級數,並且在補碼上變爲負偶數),所以在允許負輸入的情況下它不是完全可移植的。

便攜式答案是(number % 2 == 0) ? number : number+1;,讓編譯器擔心優化。

還要小心,你還沒有定義什麼結果應該爲INT_MAX,這是奇數,但其中並不存在較大的值,即使是int值。

3

由於大多數這裏的答案要麼是不可移植或有多餘條件句,這裏是快速和便攜答案:

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

unsigned的情況下確保了按位與預期的定義,和演員回到int(這是定義良好的,因爲可能的位和操作的值,零或一個,適合於int)阻止number被提升爲unsigned,當它被轉換回int時,這會導致實現定義的行爲將結果分配給number

1

我知道問的int OP,但這裏有一個答案花車太:

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); 
相關問題