如果数字为奇数(对于负数也是如此),如何仅执行按位(移位,和或x ..)四舍五入为偶数?
示例:
我尝试过的方法:到目前为止,该方法仍然有效,但似乎有点多余?
(((n + 1) >> 1) << 1)
有没有更短的解决方案?
答案 0 :(得分:1)
一种解决方案是在数字中添加最低有效位:
n+(n&1)
如果n
为偶数,则其LSB为0,并且该数字未如预期那样保持不变。
如果n
为奇数,则其LSB为1,并且n
将变为紧接其上方的偶数。
这是基于算术运算的,并且可以用于正数和负数。
它甚至不依赖于数字以二进制补码编码的事实。唯一真实的假设是,偶数的LSB为0,奇数的LSB为1。如果n
以不寻常的方式编码,则只要验证了此假设,该方法仍然可以使用。例如,使用以符号绝对值编码的数字或使用多余的代码(多余的数字为偶数)。
您的方法虽然在大多数计算机上都正确,但可以通过左右移动来实现((n + 1)÷2)×2。但是C或C ++标准暂时(暂时)不依赖于带符号整数右移的含义来实现,并且在某些异常的体系结构/编译器上,代码可能会因负数而中断。