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

Integer类中的Java getChars方法,为什么使用位运算而不是算术运算?

仉英朗
2023-03-14
问题内容

因此我正在研究Integer的类源代码(JDK 8)以了解如何将int转换为String。似乎正在使用称为getChars(第433行)的程序包私有方法将转换intchar数组。

尽管代码并不难理解,但是有多行代码使用逐位移位运算而不是简单的算术乘法/除法,例如以下几行代码:

// really: r = i - (q * 100);
r = i - ((q << 6) + (q << 5) + (q << 2));

q = (i * 52429) >>> (16+3);
r = i - ((q << 3) + (q << 1));  // r = i-(q*10) ...

我只是不明白这样做的目的,这实际上是一种优化,并且会影响算法的运行时间吗?

编辑:

换句话说,由于编译器在内部进行这种类型的优化,因此这种手动优化是否必要?


问题答案:

我不知道进行此特定更改的原因,除非您找到原始作者,否则无论如何您都不可能找到权威的答案。

但是,我想回应一个更广泛的观点,那就是运行时库(和许多内部包)中 的许多
代码java.*已优化到某种程度,这种程度在应用于“”时非常不寻常(我敢说是不负责任的)。正常”的应用代码。

基本上有两个原因:

  1. 在很多不同的环境中,它被称为很多。如果每天只在3台服务器上执行50次,那么优化服务器中的方法以减少0.1%的CPU时间将是不值得的。但是,如果您可以使将要执行它的 每个 人的Integer.toString速度提高0.1%,那么这确实可以变成很大的变化。 __
  2. 如果在特定VM上优化应用程序代码,则当编译器决定进行其他优化时,将该VM更新到较新版本可以轻松撤消优化。对于其中的代码,java.*这已不再是什么问题了,因为它始终随运行它的运行时一起提供。因此,如果他们引入了使给定优化不再最佳的编译器更改,那么他们可以更改代码以与此相匹配。

tl; dr java.*代码经常被疯狂地优化,因为这是值得的,并且他们可以 知道 它实际上会工作。



 类似资料:
  • 问题内容: 这里的答案为需要返回除的逻辑倒数以外的内容的情况提供了有用的参考,但是我无法想象有任何这种情况。有什么例子吗? 问题答案: SQLAlchemy是一个很好的例子。对于未启动的用户,SQLAlchemy是一个ORM,并使用Python表达式生成SQL语句。在诸如 在不返回一个布尔值,但最终能产生像SQL查询的对象。倒数会产生类似的结果,因此需要定义两种方法。

  • 我有一个简单的程序来测量浮点乘法(和随机生成,编译g-O0)。在主机(Ubuntu 16.04)上运行时,每10000000次乘法得到约1.6秒,在图像“Ubuntu”的容器中运行时(无需重新编译),得到约3.6秒。有人能解释为什么它慢了2.5倍吗? p、 我多次运行程序来消除异常值。我不需要优化它,只需要详细解释那里发生了什么。 编译 要在构建后使用的容器内运行:

  • 问题内容: 我正在研究《 Beginning Android Games》 这本书。我注意到的一件事是: 这是我第一次看到这样的变量,所以我不知道它的作用。我在Java中运行代码并创建了一些示例。 如果我运行此代码: 答案将是0?这是为什么? 如果我运行此代码: 起初,我认为这是价值的串联,因此我假设i = 10500,但事实并非如此。答案是一样的。还是0?有人知道这里发生了什么吗? 问题答案:

  • 假设: 2的补码形式的32位有符号整数 true和false是值为1和0的整数 java运算符 你能实现像<代码>

  • 我试图用if-let表达来概括我的大脑。我知道它的作用,但我找不到一些细节背后的基本原理。 第一个细节是赋值运算符而不是相等运算符的使用,第二个细节是操作数的位置。 例如: 在我看来,这样更“清晰”: 或者更好: 有人能帮我理解这背后的原理吗?

  • 问题内容: 我是一个仅出于乐趣而编写代码的人,并且在学术或专业环境中都没有真正地去研究它,所以像这些按位运算符之类的东西真的让我感到困惑。 我正在阅读一篇有关JavaScript的文章,该文章显然支持按位操作。我一直看到该操作在某些地方提到过,并且我尝试阅读以弄清楚它到底是什么,但是我似乎一点也不了解。那是什么 清楚的例子会很棒!:D 再问几个问题-按位运算的一些实际应用是什么?您什么时候可以使用