右移2进行分割

我知道我可以用右移执行2分。

为了简单起见,需要一个4位数字系统

-1 - 1111
-2 - 1110
-3 - 1101
-4 - 1100
-5 - 1011
-6 - 1010
-7 - 1001
-8 - 1000
7  - 0111
6  - 0110
5  - 0101
4  - 0100
3  - 0011
2  - 0010
1  - 0001
0  - 0000

如果我尝试表演

6 / 2 = 0110 >> 1 = 0011 = 3
-6/ 2 = 1010 >> 1 = 1101 = -3

对于+ ve和-ve编号均有效

但是,当来到1

1 / 2 = 0001 >> 1 = 0000 = 0
-1/ 2 = 1111 >> 1 = 1111 = -1

似乎有-1在特殊情况下,如右移,然后将其移至负无穷。

目前,我需要特别检查一下,因为我预计-1 / 2 = 0。

我想知道你们在你的代码中如何处理这个异常? 你家伙放了一张if check?


任何负数的奇数都不起作用。 然而,要回答你的问题,如果你知道你可以有负数,只需除以2.这变成了一个由jit /编译器修正的转变。


@Anon在技术上是正确的。

但是,最好的做法是使用/运算符进行除法运算,并将微优化留给JIT编译器。 JIT编译器能够通过常量优化分区作为移位/添加序列...当这是执行平台的最佳做法时。

做这种事情(可能)是一种不成熟的优化,如果你的代码需要在多个Java平台上快速运行,它可能是一种反优化。


如果你右移两除,你总是最终“四舍五入”下降 - 如果是积极的趋向零,如果是负数则远离它。

如果这不是你想要的,你可以纠正它:

if (n & 1 > 0 && n < 0)
    result += 1;
链接地址: http://www.djcxy.com/p/39571.html

上一篇: Right Shift to Perform Divide by 2 On

下一篇: Advantages of using immutable.js over Object.assign or spread operators