Algorithm 如果是奇数,如何对偶数执行位向上舍入?
如果数字是奇数(也适用于负数),如何执行仅按位(移位、and、or、xor…)向上舍入到偶数 例如:Algorithm 如果是奇数,如何对偶数执行位向上舍入?,algorithm,rounding,bitwise-operators,bit,shift,Algorithm,Rounding,Bitwise Operators,Bit,Shift,如果数字是奇数(也适用于负数),如何执行仅按位(移位、and、or、xor…)向上舍入到偶数 例如: 投入:3;产出:4 投入:4;产出:4 投入:5;产出:6 投入:6;产出:6 输入:-14;产出:-14 输入:-15;产出:-14 我试过的:到目前为止,这是可行的,但似乎有点多余 (((n + 1) >> 1) << 1) ((n+1)>>1)解决方案是将最低有效位添加到数字中: n+(n&1) 如果n为偶数,则其LSB为0,并且数字与预期相同。 如
- 投入:3;产出:4
- 投入:4;产出:4
- 投入:5;产出:6
- 投入:6;产出:6
- 输入:-14;产出:-14
- 输入:-15;产出:-14
(((n + 1) >> 1) << 1)
((n+1)>>1)解决方案是将最低有效位添加到数字中:
n+(n&1)
如果n
为偶数,则其LSB为0,并且数字与预期相同。
如果n
为奇数,则其LSB为1,n
将更改为紧靠其上方的偶数
这是基于算术运算的,对正数和负数都有效
它甚至不依赖于数字是以2的补码编码的事实。唯一真实的假设是偶数的LSB为0,奇数的LSB为1。如果n
以一种不寻常的方式编码,只要这个假设得到验证,这个方法应该仍然有效。例如,对于以符号绝对值编码的数字或h过量代码(过量为偶数)
你的方法,虽然在大多数计算机上都是正确的,但是通过右移位和左移位实现((n+1)和div;2)×2。但是C或C++标准离开(暂时)实现依赖于符号整数上右移的含义,而在某些不寻常的体系结构/编译器上,代码可能会出现负数。
n+(n和1)。略短。还有n+1&-2
(这也概括为二的其他幂的四舍五入)@AlainMerigot如果你把它写成一个答案,我会接受你的答案。