如何为给定的int找到最接近的偶数? (给出11回报12)

时间:2010-12-05 18:13:15

标签: c++ c int

那么如何创建一个函数来返回离9 9+ 1最近的函数到给定的int,除以2 int时没有余数?

9 个答案:

答案 0 :(得分:41)

舍入到最近的int:

number+=(number & 1)

答案 1 :(得分:31)

向下舍入到

x & ~1

即使是

(x + 1) & ~1

答案 2 :(得分:15)

给定整数时,

“最近”是不明确的。比方说,9:8和10都是偶数,并且同样接近它。如果你想总是上去,那就像...

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

答案 3 :(得分:11)

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

另一种方式是(number>>1)<<1 ,但我不确定否定/小/大端。

答案 4 :(得分:8)

我通常喜欢的方式是(number+1) & ~1不是每个人都能识别成语,所以你可能需要考虑你的观众。

特别是,如果它应该适用于负整数,那么C和C ++的非二进制补码实现不会识别这个成语(它会将奇数负数向下舍入而不是向上取消负号+幅度数,并且在补码上将偶数偶数奇数转为奇数,所以在允许负输入的情况下它不是完全可移植的。

便携式答案是(number % 2 == 0) ? number : number+1;,让编译器担心优化。

还要注意你没有定义INT_MAX的结果,这是奇数,但是没有更大的偶int值。

答案 5 :(得分:4)

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

答案 6 :(得分:3)

由于这里的大部分答案都是非便携式或有过多的条件,所以这是快速便携的答案:

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

unsigned的情况确保按位 - 并且被定义为预期,并且强制转换回int(由于按位和操作的可能值,零或一个,这是明确定义的,适合int)阻止number升级为unsigned,这会导致实现定义的行为,当它转换回int以将结果分配给{ {1}}。

答案 7 :(得分:3)

派对有点晚了,但这是一个干净的解决方案

n += (n % 2);

答案 8 :(得分:2)

我知道OP要求int,但这里也有浮动的答案:

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