How do you calculate log base 2 in Java for integers?
今天遇到问题需要计算以2为底的对数值(需要整数),找了半天API中log函数有自然对数,以10为底的对数,没有以2为底的,~~o(>_<)o ~~,API中提供的方法返回的都是double类型的,可能你会觉得,不就这么简单嘛,其实这里面学问也挺大的呢,且听我慢慢叙来~~
- 方法一:
log[a]x log[b]x = --------- log[a]b
log[10]x log[2]x = ---------- log[10]2
- static int pow(int base,int power){
- int result =1;
- for(int i =0; i < power; i++)
- result *= base;
- return result;
- }
- private static void test(int base,int pow){
- int x = pow(base, pow);
- if(pow != log(x, base))
- System.out.println(String.format("error at %d^%d", base, pow));
- if(pow!=0&&(pow-1)!= log(x-1, base))
- System.out.println(String.format("error at %d^%d-1", base, pow));
- }
- static int log(int x,int base)
- {
- return(int)(Math.log(x)/Math.log(base));
- }
- public static void main(String[] args){
- for(int base =2; base <500; base++){
- int maxPow =(int)(Math.log(Integer.MAX_VALUE)/Math.log(base));
- for(int pow =0; pow <= maxPow; pow++){
- test(base, pow);
- }
- }
- }
error at 3^5error at 3^10error at 3^13error at 3^15error at 3^17error at 9^5error at 10^3error at 10^6error at 10^9error at 11^7error at 12^7...
也就是说,当底为第一个数,指数为第二个数时,用(int)(Math.log(x)/Math.log(base))是有问题的,又有人提出用近似值("epsilon")来减小误差:(int)(Math.log(x)/Math.log(2)+1e-10),这种方法也是可以的;
- 方法二:
- public static int log2(int n){
- if(n <=0)throw new IllegalArgumentException();
- return31-Integer.numberOfLeadingZeros(n);
- }
UPD: My integer arithmetic function is 10 times faster than Math.log(n)/Math.log(2).
- 方法三:
- public static int log2X(int bits )// returns 0 for bits=0
- {
- int log =0;
- if(( bits &0xffff0000)!=0){ bits >>>=16; log =16;}
- if( bits >=256){ bits >>>=8; log +=8;}
- if( bits >=16 ){ bits >>>=4; log +=4;}
- if( bits >=4 ){ bits >>>=2; log +=2;}
- return log +( bits >>>1);
- }
- //自己慢慢理解吧^_^
这种方法要比 Integer.numberOfLeadingZeros() 快上20-30%,要比一个如下所示的基于Math.log()
的 方法几乎快10 倍:
- private static final double log2div =Math.log(2);
- public static int log2fp(int bits )
- {
- if( bits ==0)
- return0;// or throw exception
- return(int)(Math.log( bits &0xffffffffL)/ log2div );
- }
我说的没错吧,可能你觉得太钻牛角尖了,也是,不过别人能用更优雅,效率更高的方法实现相 同的功能,也
值得借鉴一下,并且以后在用浮点数代替整数计算时也要晓得,会不会有“陷阱”~~
转载于:https://blog.51cto.com/lbrant/469310
How do you calculate log base 2 in Java for integers?相关推荐
- eclipse报错:An error has occurred. See error log for more details. java.lang.NullPointerException
eclipse一直不停的报错: An error has occurred. See error log for more details. java.lang.NullPointerExceptio ...
- 解决Sentinel log base directory is: C:\Users***\logs\csp\
在项目总是会生成csp文件,而且会越来越多,自己的项目里面也没有用到Sentinel ,但依赖里面有引用,删掉依赖就好了.
- calculate整数计算(Base父类及子类Sub)
>calculate整数计算(Base父类及子类Sub)< 定义一个父类 Base 中的方法 calculate() ,该方法用于计算两个数的乘积(X*Y).定义一个 Base 类的子类 ...
- Android 解读Event和Main Log
1 Android P EventLogTags文件 Android P 9.0.0 所有EventLogTags文件List: system/bt/EventLogTags.logtags syst ...
- java如何算log_用java代码计算Log(a)b
1 java标准包提供了自然对数的计算方法,2 其他的对数计算可以转换为自然对数的计算. Sun的J2SE提供了一个计算自然对数方法--double java.lang.Math.log(double ...
- Android_8.1 Log 系统源码分析
文章目录 0x01 [Android Log框架推荐](https://www.jianshu.com/p/64b63e51fd4c) 1. [logger](https://github.com/o ...
- NXP S32K146 打印LOG函数分析
最近从STM32换成NXP的S32K1平台做项目,从读手册调外设驱动开始,关于外设驱动是怎么调的,我用的软件是S32 Design Studio for ARM Version 2.2 在官网下载的, ...
- Log4j配置输出log文件的相对路径
转载请注明来源-作者@loongshawn:http://blog.csdn.net/loongshawn/article/details/52967694 1 配置log4j log4j.prope ...
- Android event log 说明
目录 1. Android 系统中对于 event log 的定义文件 2. event 的类别 3. 手机中查看 event log 事件信息 1. Android 系统中对于 event log ...
- Android 解读main log和event log日志信息
ENV:Android M 6.0.1 一 分析main log 1.1 通过adb logcat输出的main log文件,每一行都是以如下格式作为开头信息 格式:timestamp PID TID ...
最新文章
- cpu安装_CPU是AMD的,老台式电脑可以加装固态硬盘安装Win10系统吗?
- WPF - 资源收集
- Spring基于注解的AOP配置
- [转载] 羽毛球——学打羽毛球 09 步法的基本概念
- [编程题]数字分类 (20)
- api接口返回动态的json格式?我太难了,尝试一下 linq to json
- Python 开发者 2017 应该关注的 7 个类库
- php最难,那个PHP中号称最难的‘递归函数’
- jave使用corenlp
- 【实用工具系列】MathCAD入门安装及快速上手使用教程
- 香港服务器的数据泄露是什么?怎样预防?
- java爬虫实战(3):网易云音乐评论,歌曲,歌单,歌词下载
- huihoo和中国的开源,路在何方???
- DIV+CSS布局基本流程及实例介绍
- 基于Qt的音乐播放器(二)切换歌曲,调节音量,调节语速,暂停
- 请编写一个程序,使用字典存储学生信息,学生信息包括学号和姓名,请根据学生学号从小到大的顺序输出学生信息。
- 计算机应用最普遍的汉字字符编码是什么,计算机中目前最普遍使用的汉字字符编码是什么...
- 基于pyqt5开发的图书管理系统UI(带登录页面)
- 财路网每日原创推送:浅谈:区块连数字身份
- 修改falcon的钉钉告警格式
热门文章
- java程序拦截dde漏洞问题_Office DDE漏洞学习笔记
- LINUX编译mate-desktop/pluma-1.24.0文本编辑器
- /bin/sh: 1: tclsh: not found
- JAVA压缩、解压,使用Apache Common Compress包下载链接
- 南半球左撇子的人是否多一些
- python turtle代码示例-Python turtle.left方法代码示例
- 免费文件分发服务器,文件分发服务器 AWS CloudFront(CDN)使用入门-以S3为例 Lebal:Research...
- nginx代理php不能跳转页面,nginx 解决首页跳转问题详解
- win2012 定时自动备份mysql_SQL SERVER 2012数据库自动备份的方法
- ai画面怎么调大小_AI人脸抓拍摄像机安装指导,这样安装抓拍更准