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

标签 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()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 个选择是:

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

关于java - 使用 `>>` 之前检查模块的替代方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24819528/

相关文章:

java - AES 自定义 key 而不是 16、24 或 32 字节

c# - 如何制作可在 C# 应用程序中引用的 Win32 DLL?

c# - 将列表中的元素作为第一个元素的最快方法

javascript - 如何将数组中的单个文件附加到 FormData?

javascript - 使用 Google Maps API 显示 JSON 文件中的多边形

java - Maven 下载的损坏的 jar

java - 当我提交大于1M的json字符串时,如何解决Spring MVC中的org.springframework.web.bind.MissingServletRequestParameterException?

javascript - SignalR - 连接启动失败

java - 当 compareto 返回 0 时理解 TreeSet

c# - 未调用 WPF IValueConverter.ConvertBack