详解Integer.highestOneBit()

方法结果

highestOneBit()这个静态方法是得到小于等于参数的最大2的幂
举个例子:

  		System.out.println(Integer.highestOneBit(7));
        System.out.println(Integer.highestOneBit(15));
        System.out.println(Integer.highestOneBit(16));
        System.out.println(Integer.highestOneBit(17));

输出结果如下:
在这里插入图片描述


如何做到的?

不得不感叹优秀的作者已经把位运算用的炉火纯青了 干净整洁的位运算 那么我们来分析一下这个代码是如何做到的
在这里插入图片描述


2的幂次方数的规律

首先我们需要明白一个概念 如果一个数是2的幂次方数 那么这个数表示成10进制的时候 一定只有一个1而其他位上都是0
比如 : (markdown对其太难了 直接上图)
在这里插入图片描述
知道了这个规律 我们直接返回第一个1 后面都变成0就可以了


参数(10) 在方法中都经历了什么

用10举例 我们看看这个10在整个计算的过程中都经历了什么
在这里插入图片描述
再看一眼源码 这里其实只用到了 | 或运算 >>右移 >>>无符号右移 把10代入 我们走一遍流程 如下:

在这里插入图片描述
第一个 i |= (i>>1) 我们得到了 0000 1111 也就是15这个数字


继续走 第二句话 右移2位
在这里插入图片描述
运算到这里我们发现 其实后面不管是移动4、8、16位 最后得到的都是 0000 1111 15这个数字

在这里插入图片描述

最后进行一次无符号右移
在这里插入图片描述
神奇的效果出现了! 我们得到了一个8 恰好是我们想要的结果 ,接下来分析一下这个过程


从结论分析

其实我们不管拿到什么数字 想要拿到比他小的最大2的幂
只需要把第一个1后面的所有数字都变成0就可以了


大数字通用例子

这一次我们用一个比较大的通用的例子看一看整个过程
在这里插入图片描述
以此类推 直到方法最后一句之前 我们会得到一个第一个1出现的位置 后面全是1的数字
在这里插入图片描述

最后总结

高 实在是高!

发布了24 篇原创文章 · 获赞 10 · 访问量 3084

猜你喜欢

转载自blog.csdn.net/qq_43091847/article/details/103902357