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

时间:2019-06-17 08:20:52

标签: algorithm rounding bitwise-operators bit shift

如果数字为奇数(对于负数也是如此),如何仅执行按位(移位,和或x ..)四舍五入为偶数?

示例:

  • 输入:3;输出:4
  • 输入:4;输出:4
  • 输入:5;输出:6
  • 输入:6;输出:6
  • 输入:-14;输出:-14
  • 输入:-15;输出:-14

我尝试过的方法:到目前为止,该方法仍然有效,但似乎有点多余?

(((n + 1) >> 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 ++标准暂时(暂时)不依赖于带符号整数右移的含义来实现,并且在某些异常的体系结构/编译器上,代码可能会因负数而中断。