当前位置: 首页 > 面试题库 >

Java是否将除数除以2的幂来优化移位?

姚伟
2023-03-14
问题内容

Java编译器 JIT编译器是否通过恒定的2到位移位的幂来优化除法或乘法?

例如,以下两个语句是否被优化为相同?

int median = start + (end - start) >>> 1;
int median = start + (end - start) / 2;

(基本上是这个问题,但对于Java)


问题答案:

不,Java编译器不会执行此操作,因为无法确定将显示什么符号(end - start)。为什么这么重要?负整数上的位移产生与普通除法不同的结果。在这里,您可以看到一个演示:这个简单的测试:

System.out.println((-10) >> 1);  // prints -5
System.out.println((-11) >> 1);  // prints -6
System.out.println((-11) / 2);   // prints -5

另请注意,我使用>>代替>>>。A >>>是无符号的移位,而A 是带符号的>>

System.out.println((-10) >>> 1); // prints 2147483643

@Mystical:我写了一个基准测试,它表明编译器/ JVM并没有进行优化:https
://ideone.com/aKDShA



 类似资料:
  • 问题内容: 问题说明了一切。有人知道以下内容吗? …被优化成? 编译器会这样做吗?(我的兴趣在于GCC)。在某些情况下会这样做吗?在其他情况下却不会呢? 我真的很想知道,因为每次我写一个像这样可以优化的除法运算时,我都会花些精力思考是否浪费一秒钟宝贵的时间去做一个足以满足需要的除法运算。 问题答案: 即使g++ -O0(是,-O0!),也会发生这种情况。您的函数编译为: 请注意shrq $6,右移

  • 问题内容: 许多年前,在大学里,我了解到,右移一位的功能与除以2的功能相同,但是通常速度要快得多。自从9到10年前我了解到Java以来​​,我不确定Java在这方面是如何发展的。Java编译器是否会自动将除二转换为移位操作,还是应该自己在代码中手动执行移位操作? 问题答案: 恕我直言,除非您在经常发生位移的商店和代码库中工作,否则恕不接受混淆。是的,这些表达式在逻辑上可能是等效的,但: n00b可

  • 问题内容: 我试图除以2计数以返回一个百分比。 返回以下查询: 我应该应聘演员吗? 问题答案: 我会用两个s来做不同的事情:

  • 我读过: > 排除从父pom继承的子pom中的依赖项 多模块项目:从父pom中排除依赖项 排除从父POM继承的工件? 排除父POM中的指令 如何在Maven中从父项目中排除依赖项? 我的结论是,没有办法排除从父pom继承的特定依赖项。我使用的是maven,父pom不可编辑。 所以,我想在它打包到目标jar之前,排除jar本身的依赖项。 该pom声明了依赖项,我想排除它并且根本不导入我的项目。 如果

  • 问题内容: Java 是这里的关键。我需要能够删除文件,但是用户希望能够从回收站中“取消删除”。据我所知这是不可能的。有人知道吗? 问题答案: 由于各种原因,Windows 没有简单地对应于回收站的文件夹的概念。 正确的方法是使用JNI调用Windows API,并在结构中设置标志。 SHFileOperation文档 使用SHFileOperation复制文件的Java示例(同一文章中的“回收站

  • 问题内容: 下面的代码不适用于某些输入。 我最初的想法是检查每个输入是否为2的幂,方法是从1开始乘以2直到超过输入数量,然后在每个步骤进行比较。相反,我预先存储了2的所有幂,以便检查中的给定输入。如何改善呢? 问题答案: 将 _ 最好的,最准确_ 的方法是使用位操作: 说明: 2的每个幂将1位恰好设置为1(该数的对数以2为底的索引中的位)。因此,当从中减去1时,该位​​翻转为0,而所有在前位翻转为