右移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