当前位置: 首页 > news >正文

Java源码解读之常量52429

文章目录

    • 为什么有52429的常量呢?
    • 对于为什么选择52429?
    • 那么为什么不再选几位呢?

在JDK8源码中 java.lang.Integer有52429作为常量出现,

为什么有52429的常量呢?

static void getChars(int i, int index, char[] buf) {int q, r;int charPos = index;char sign = 0;if (i < 0) {sign = '-';i = -i;}// Generate two digits per iterationwhile (i >= 65536) {q = i / 100;// really: r = i - (q * 100);r = i - ((q << 6) + (q << 5) + (q << 2));i = q;buf [--charPos] = DigitOnes[r];buf [--charPos] = DigitTens[r];}// Fall thru to fast mode for smaller numbers// assert(i <= 65536, i);for (;;) {q = (i * 52429) >>> (16+3); //相当于i/10;r = i - ((q << 3) + (q << 1));  // r = i-(q*10) ...buf [--charPos] = digits [r];i = q;if (i == 0) break;}if (sign != 0) {buf [--charPos] = sign;}
}public static String toString(int i) {if (i == Integer.MIN_VALUE)return "-2147483648";int size = (i < 0) ? stringSize(-i) + 1 : stringSize(i);char[] buf = new char[size];getChars(i, size, buf);return new String(buf, true);
}

固定的形式是一个整型变量乘上52429,然后向右移19位。很自然想到2^19=524288,那么这个52429就不难理解了,应该就是除10的操作。

除法是很慢的,而乘法和以为却相对较快,所以为了优化这一点点的速度,java采用了乘52429再移19位的方法。

对于为什么选择52429?

这里列出几个取值的精度:

 103/1024≈0.1006 (2^10)205/2048≈0.100098 (2^11)……26215/262144≈0.100002 (2^18)52429/524288≈0.10000038 (2^19)104858/1048576≈0.10000038 (2^20)

可见,到2^19次方左右,除10的精度已经非常高了。

那么为什么不再选几位呢?

原因很简单:

  • java中整型占32位,而52429的二进制是1100110011001101(16位),65535的二进制是111111111111111(16位),相乘结果为31位。
  • 通过阅读上述源码的这个方法可知,i是不会大于65535的(注释中也提到:assert(i <= 65536, i);),所以算上符号位,能达到精度最大而又不溢出的也就是2^19了。
http://www.lryc.cn/news/390080.html

相关文章:

  • “Photoshop AI插件:StartAI的全面使用攻略
  • 入门Axure:快速掌握原型设计技能
  • Java中的序列化与反序列化详解
  • 在鸿蒙开发中如何实现皮肤切换?
  • FlowUs新一代内容创作营销平台|FlowUs息流国产 好用 不限速
  • WebSocket解决方案(springboot 基于Redis发布订阅)
  • 如何优化网站SEO排名?
  • 基于Java的音乐网站系统-计算机毕业设计源码01239
  • 云原生之容器编排实践-OpenEuler23.09在线安装Kubernetes与KubeSphere
  • Ubuntu 截图shutter,图像编辑 gimp,录屏kazam
  • WSO2 products 文件上传漏洞(CVE-2022-29464)
  • YOLOv8改进 | 卷积模块 | SAConv可切换空洞卷积
  • 使用Python下载并合并HLS视频片段
  • 常见的九种二极管
  • 竞赛选题 python的搜索引擎系统设计与实现
  • 大模型技术方向夏令营1期-对话分角色要素提取挑战赛
  • 类和对象(封装、继承、多态、友元)
  • 关于Yolov8我踩过的那些坑
  • Linux——shell原理和文件权限
  • 网络工程师需要熟悉Docker吗?我觉得不需要精通,但是得懂基础
  • c++初级-2-引用
  • 如何清理电脑内存?让电脑运行如飞!
  • [数据集][目标检测]人员状态跑睡抽烟打电话跌倒检测数据集4943张5类别
  • Java8 - Stream API 处理集合数据
  • 漫步5G-A City,一份独属于上海的浪漫
  • SpringBoot 如何处理跨域请求?你说的出几种方法?
  • OV SSL证书年度成本概览:为企业安全护航的经济之选
  • 歌尔气压计SPA06-003在无人机的创新应用
  • python3多文件操作
  • 312. 戳气球