在 Java、C#、Javascript 中:
AFAIU - >>
是一个右移操作数,也可以处理有符号数:
没有问题:
12>>2 --> 3
还有签名号码:
-12>>2 --> -3
但是当小数结果不是整数时,结果不同:
10>>2 --> 2
而-10>>2 --> -3
我完全知道为什么会发生这种情况(通过补码),但是:
问题:
这是否意味着当我使用有史以来最快的除法>>
时 - 我必须检查:
10%4
不为零?
我在这里遗漏了什么吗?
最佳答案
您可以使用 Integer.numberOfTrailingZeros()
和 Long.numberOfTrailingZeros()
等方法来判断移位是准确还是被 chop 。
您还可以使用按位 AND 来测试最后一位,例如测试最后 4 位:
int i = 543;
if ((i & 0x0f) == i )
System.out.println("Last 4 bits are zeros!");
尽管请注意,不值得使用位移位来进行“快速”除法。您不会比编译器更聪明,因为当今大多数编译器都足够智能来优化这些情况。
更多信息:Is multiplication and division using shift operators in C actually faster?
编辑:
你的问题的答案是,位移位并没有被定义为“有史以来最快的除法”,它的定义如其名称所示:位移位,其中如果负数给出(或可能给出)不同的结果。
你没有错过任何东西。如果您的输入可能为负,您的 2 个选择是:
- 检查该值,如果它可能给出不同的结果,请对其进行修正或使用除法。一个简单的检查可能是测试它是否为负,或者测试最后的位(如上所述)。
- 完全避免使用位移位进行除法。
关于java - 使用 `>>` 之前检查模块的替代方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24819528/