详解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的数字
在这里插入图片描述

最后总结

高 实在是高!

  • 6
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值