在使用`>>`之前检查模块的替代方法?

时间:2014-07-18 07:31:25

标签: java c# javascript bitwise-operators

In-Java,C#,Javascript:

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

没有问题:

12>>2 --> 3

还有签名号码:

-12>>2 --> -3

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

10>>2 --> 2

-10>>2 --> -3

我完全清楚它为什么会发生(通过两个补充),但是:

问题:

这是否意味着当我使用最快的分区>>时 - 我必须检查:

10%4不是零?

我在这里遗漏了什么吗?

1 个答案:

答案 0 :(得分:1)

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

您也可以使用按位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?

修改

您的问题的答案是位移未被定义为“有史以来最快的分区”,它被定义为其名称所示:位移,其中在负数的情况下给出(或可能给出)不同的结果。

你没有遗漏任何东西。如果您的输入可能是否定的,那么您的两个选项是:

  1. 检查值以及是否可能给出不同的结果,进行腐蚀或使用除法。一个简单的检查可能是测试它是否为负,或测试最后一位(如上所述)。
  2. 完全避免使用位移进行除法。