【问题标题】:How to perform a bitwise round up to even numbers if odd?如果奇数,如何执行按位舍入到偶数?
【发布时间】:2019-06-17 08:20:52
【问题描述】:

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

例子:

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

我尝试了什么:到目前为止这有效,但似乎有点多余?

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

有没有更短的解决方案?

【问题讨论】:

  • n+(n&1) 略短。
  • 还有n + 1 &amp; -2(这也概括为四舍五入到其他二的幂)
  • @AlainMerigot 如果您将其写为答案,我会接受您的答案。

标签: algorithm rounding bitwise-operators bit shift


【解决方案1】:

解决方案是在数字中添加最低有效位:

n+(n&1)

如果n为偶数,则其LSB为0,且数字不变。
如果n 为奇数,则其LSB 为1,n 将变为紧接其上方的偶数。

这是基于算术运算的,适用于正数和负数。

它甚至不依赖于数字以二进制补码编码的事实。唯一真实的假设是偶数的 LSB 为 0,奇数的 LSB 为 1。如果 n 以不寻常的方式编码,则此方法应该仍然有效,前提是该假设得到验证。例如,用符号绝对值编码的数字或用多余的代码(多余的偶数)。

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

【讨论】:

    猜你喜欢
    • 2012-02-17
    • 2015-05-19
    • 2019-02-09
    • 1970-01-01
    • 1970-01-01
    • 2022-11-25
    • 2020-06-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多