如果奇数,如何执行按位舍入到偶数?

How to perform a bitwise round up to even numbers if odd?

如果数字是奇数(也适用于负数),如何仅按位执行(移位、与、或、异或..)四舍五入到偶数?

示例:

我试过的方法:到目前为止这可行,但似乎有点多余?

(((n + 1) >> 1) << 1)

有更短的解决方案吗?

一个解决方案是将最低有效位添加到数字中:

n+(n&1)

如果n是偶数,则其LSB为0,如预期的那样数字不变。
如果n为奇数,则其LSB为1,n将变为其正上方的偶数。

这是基于算术运算,对正数和负数都有效。

它甚至不依赖于数字以二进制补码编码的事实。唯一真实的假设是偶数的 LSB 为 0,奇数的 LSB 为 1。如果 n 以不寻常的方式编码,只要这个假设得到验证,这种方法应该仍然有效。例如,数字编码为 sign-absolute 值或多余代码(多余偶数)。

你的方法虽然在大多数计算机上都是正确的,但通过左右移位实现了((n+1)÷2)×2。但是 C 或 C++ 标准(目前)让实现依赖于有符号整数右移的含义,并且您的代码可能会因某些不寻常的 architectures/compilers 上的负数而中断。