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

Java 在使用`>;之前检查模块的备选方案>;`?,java,c#,javascript,bitwise-operators,Java,C#,Javascript,Bitwise Operators,在-Java、C#、Javascript中: AFAIU—>是一个右移操作数,它还可以处理有符号数: 以下方面没有问题: 12>>2-->3 对于签名号码: -12>>2-->-3 但当十进制结果不是整数时,结果不同: 10>>2-->2 鉴于-10>>2-->-3 我完全知道为什么会发生这种情况(通过二的补语),但是: 问题: 这是否意味着当我使用有史以来最快的除法时,我必须检查: 10%4不是零 我是不是遗漏了什么 您可以使用诸如Integer.numberOfTrailingZeros()

在-Java、C#、Javascript中:

AFAIU—
>
是一个右移操作数,它还可以处理有符号数:

以下方面没有问题:

12>>2-->3

对于签名号码:

-12>>2-->-3

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

10>>2-->2

鉴于
-10>>2-->-3

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

问题:

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

10%4
不是零


我是不是遗漏了什么

您可以使用诸如
Integer.numberOfTrailingZeros()
Long.numberOfTrailingZeros()
之类的方法来判断移位是精确的还是截断的

您还可以使用按位和测试最后一位,例如测试最后4位:

int i = 543;
if ((i & 0x0f) == i )
    System.out.println("Last 4 bits are zeros!");
不过请注意,对于“快速”除法,不值得使用位移位。你不会比编译器更聪明,因为今天的大多数编译器都足够智能,可以优化这些情况

有关这方面的更多信息:

编辑

您的问题的答案是,位移位并不是“有史以来最快的除法”,而是定义为它的名称:位移位,在负数的情况下,它会给出(或可能给出)不同的结果

你没有遗漏任何东西。如果您的输入可以是负数,则有两个选项:

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

  • 你的回答是关于检查最后一位。我的问题不是关于检查,而是通过负值sp.s除法结果不同的问题。我发现JS中一个可能的解决方案是
    -~~(10>>2)
    我建议删除
    ieee-754
    标签;这与问题无关。