highestOneBit 获取一个int类型的二进制取整
public static int highestOneBit(int i) {
// HD, Figure 3-1
i |= (i >> 1);
i |= (i >> 2);
i |= (i >> 4);
i |= (i >> 8);
i |= (i >> 16);
return i - (i >>> 1);
}
上述代码粗看会不理解实现原理,但是跟着推导一次就能理解算法的思想。假定一个int的二进制表达式是
100001000
,这个常数的迭代过程如下:- 第一次结束
100001000
->110001100
- 第二次结束
110001100
->111101111
- 第三次结束
111101111
->111111111
- 第四次结束
111111111
->111111111
- 第五次结束
111111111
->111111111
111111111
-11111111
= 100000000
。整个实现过程中,即为不停的将首位1和后续的位进行与操作,并且首位1第一次复制成2个,第二次2*2复制成4个,第三次复制成2*4 = 8个(如果这个int大于2^8),以此类推,按照指数形式将首位1向后与之后,我们最后就能让所有位全部变成1。最后右移1位然后相减,去掉首位之后的所有的1即可。
【Java的Integer类方法解读】此种实现方式,简化了迭代次数,并且由于充分利用上一次的赋值结果,所以不用考虑第三位是否成功被赋值,第五位成功被赋值等(因为在(int)log2(n)+1)次会被赋值。
推荐阅读
- Java|Java基础——数组
- 人工智能|干货!人体姿态估计与运动预测
- java简介|Java是什么(Java能用来干什么?)
- Java|规范的打印日志
- Linux|109 个实用 shell 脚本
- 程序员|【高级Java架构师系统学习】毕业一年萌新的Java大厂面经,最新整理
- Spring注解驱动第十讲--@Autowired使用
- SqlServer|sql server的UPDLOCK、HOLDLOCK试验
- jvm|【JVM】JVM08(java内存模型解析[JMM])
- 技术|为参加2021年蓝桥杯Java软件开发大学B组细心整理常见基础知识、搜索和常用算法解析例题(持续更新...)