那么如何创建一个函数来返回离9 9+ 1最近的函数到给定的int,除以2 int时没有余数?
答案 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