用于在使用`>之前检查模块的备选方案>`

Alternative for checking module before using `>>`?

本文关键字:gt 模块 方案 检查 用于      更新时间:2023-09-26

In-Java,C#,Javascript:

AFAIU->>是一个右移操作数,也可以处理有符号数字:

没有问题

12>>2 --> 3

还有签名号码:

-12>>2 --> -3

但当十进制结果不是整数时,结果是不同的:

10>>2 --> 2

-10>>2 --> -3

我完全知道为什么会发生这种情况(通过Two的补码(,但是:

问题:

这是否意味着,当我使用有史以来最快的除法>>时,我必须检查:

10%4不为零?

我是不是遗漏了什么?

您可以使用Integer.numberOfTrailingZeros()Long.numberOfTrailingZeros()等方法来判断移位是准确的还是截断的。

您也可以使用逐位AND来测试最后的位,例如测试最后4位:

int i = 543;
if ((i & 0x0f) == i )
    System.out.println("Last 4 bits are zeros!");

不过请注意,不值得使用位移进行"快速"除法。你不会比编译器聪明,因为现在的大多数编译器都足够聪明,可以优化这些情况。

更多关于这个:在C中使用移位运算符的乘法和除法实际上更快吗?

编辑

你的问题的答案是,位移位并没有被定义为"有史以来最快的除法",它被定义为它的名字所说的:位移,在负数的情况下,它会给出(或可能给出(不同的结果。

你没有错过任何东西。如果你的输入可能是负数,你的2个选项是:

  1. 检查该值,如果它可能会给出不同的结果,请更正它或使用除法。一个简单的检查可能是测试它是否为负,或者测试最后一位(如上所述(
  2. 完全避免使用移位进行除法运算