方法结果
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的数字
最后总结
高 实在是高!