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

标签 algorithm rounding bitwise-operators bit shift

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

例子:

  • 输入: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/

相关文章:

c# - 迭代二叉搜索树的高度

apache-spark - Pyspark - 圆时间表示为最接近刻钟(15 分钟)的整数

python - 在列表中找到四个数字加起来等于目标值

algorithm - 计算被两条垂直线切割的水平线段

c - gcc -mno-sse2 四舍五入

c++ - 按位替换两个数字中的位

go - 倒序转换整数以倒序生成IP

长时间计数位无法按预期工作

algorithm - Pascal 中的模幂运算相对较慢

python - Kivy 中的圆角交替边缘