如果数字是奇数(也适用于负数),如何仅执行按位(移位、与、或、异或..)四舍五入到偶数?
例子:
- 输入:3;输出:4
- 输入:4;输出:4
- 输入:5;输出:6
- 输入:6;输出:6
- 输入:-14;输出:-14
- 输入:-15;输出:-14
我尝试了什么:到目前为止这可行,但似乎有点多余?
(((n + 1) >> 1) << 1)
有更短的解决方案吗?
最佳答案
一个解决方案是将最低有效位添加到数字中:
n+(n&1)
如果n
为偶数,则其LSB为0,数字不变。
如果n
为奇数,则其LSB为1,n
将变为其正上方的偶数。
这是基于算术运算,适用于正数和负数。
它甚至不依赖于数字以二进制补码编码的事实。唯一真正的假设是偶数的 LSB 为 0,奇数的 LSB 为 1。如果 n
以不寻常的方式编码,只要这个假设得到验证,这种方法应该仍然有效。例如,数字以符号绝对值编码或超码(超偶数)。
您的方法虽然在大多数计算机上都是正确的,但通过右移和左移实现了 ((n+1)÷2)×2。但是 C 或 C++ 标准(目前)让实现依赖于有符号整数右移的含义,并且您的代码可能会在某些不寻常的体系结构/编译器上因负数而中断。
关于algorithm - 如果奇数,如何执行按位舍入到偶数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56627400/