如果是奇数,如何进行按位四舍五入至偶数?

3
如何进行位运算(移位,与,或,异或等)使得奇数向上舍入到偶数?(负数也是同样的处理方式)
示例:
- 输入:3;输出:4 - 输入:4;输出:4 - 输入:5;输出:6 - 输入:6;输出:6 - 输入:-14;输出:-14 - 输入:-15;输出:-14
我的尝试:目前这个方法可以工作,但似乎有些冗余?
(((n + 1) >> 1) << 1)

有没有更简短的解决方案?


7
n + (n&1) 稍微更短一些。 - Alain Merigot
1
还有 n + 1 & -2(这个通用于向其他二次幂上舍入) - harold
@AlainMerigot 如果您将其作为答案编写,我会接受您的回答。 - ndsvw
1个回答

4

解决方法是将最低有效位添加到该数字中:

n+(n&1)

如果n是偶数,则其LSB为0,因此该数字如预期一样不变。如果n是奇数,则其LSB为1,并且n将被更改为比它大的下一个偶数。
这基于算术运算,适用于正数和负数。
它甚至不依赖于数字以二进制补码表示的事实。唯一的真正假设是偶数的LSB为0,奇数的LSB为1。如果n以不寻常的方式编码,则只要验证此假设,此方法仍然有效。例如,在使用符号-绝对值编码或过量编码(过量为偶数)的数字中。
你的方法在大多数计算机上都是正确的,通过右移和左移实现((n+1)÷2)×2。但是,C或C++标准(目前)使右移对有符号整数的含义依赖于实现,因此您的代码可能会在某些不寻常的架构/编译器上对负数出问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接