如果奇数,如何执行按位舍入到偶数?
How to perform a bitwise round up to even numbers if odd?
如果数字是奇数(也适用于负数),如何仅按位执行(移位、与、或、异或..)四舍五入到偶数?
示例:
- 输入: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
以不寻常的方式编码,只要这个假设得到验证,这种方法应该仍然有效。例如,数字编码为 sign-absolute 值或多余代码(多余偶数)。
你的方法虽然在大多数计算机上都是正确的,但通过左右移位实现了((n+1)÷2)×2。但是 C 或 C++ 标准(目前)让实现依赖于有符号整数右移的含义,并且您的代码可能会因某些不寻常的 architectures/compilers 上的负数而中断。
如果数字是奇数(也适用于负数),如何仅按位执行(移位、与、或、异或..)四舍五入到偶数?
示例:
- 输入: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
以不寻常的方式编码,只要这个假设得到验证,这种方法应该仍然有效。例如,数字编码为 sign-absolute 值或多余代码(多余偶数)。
你的方法虽然在大多数计算机上都是正确的,但通过左右移位实现了((n+1)÷2)×2。但是 C 或 C++ 标准(目前)让实现依赖于有符号整数右移的含义,并且您的代码可能会因某些不寻常的 architectures/compilers 上的负数而中断。