Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 如果是奇数,如何对偶数执行位向上舍入?_Algorithm_Rounding_Bitwise Operators_Bit_Shift - Fatal编程技术网

Algorithm 如果是奇数,如何对偶数执行位向上舍入?

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,并且数字与预期相同。 如

如果数字是奇数(也适用于负数),如何执行仅按位(移位、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,并且数字与预期相同。
如果
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如果你把它写成一个答案,我会接受你的答案。