【java】Integer.highestOneBit(int i)详解

前言

在java.lang.Integer类中有这么一个方法,你可以给它传入一个 int 类型的参数,它将返回其二进制数最高位1的权值,这个方法就是highestOneBit(int i)。

请看下面的Demo,注意方法的输入与返回值:

System.out.println(Integer.highestOneBit(7));  // 输出4
System.out.println(Integer.highestOneBit(8));  // 输出8
System.out.println(Integer.highestOneBit(9));  // 输出8

注意:若i为负整数,最高位1为符号位,返回值为-2147483648

源码

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);
}

接下来,我们通过例子的方式分析一下此方法:

假设参数为18,对应的二进制数为:0001 0010
则理想的返回结果为:0001 0000

解析步骤:
先将0001 0010右移1位
得到0000 1001,再与自身进行或运算
得到0001 1011

再将0001 1011右移2位
得到0000 0110,再与自身进行或运算
得到0001 1111

再将0001 1111右移4位
得到0000 0001,再与自身进行或运算
得到0001 1111

再将0001 1111右移8位
得到0000 0000,再与自身进行或运算
得到0001 1111

再将0001 1111右移16位,
得到0000 0000,再与自身进行或运算:
得到0001 1111

再将0001 1111无符号右移1位
得到0000 1111

最后
0001 1111 - 0000 1111 = 0001 0000

补充

  • [>>] :算术右移运算符,算术右移左边空位补上符号位
  • [>>>] :逻辑右移,也叫无符号右移,左边空位补0

我们可以将上面的解析过程进行抽象:假设现在有一个二进制数据:0001 ****,我们不关心低位的取值情况,我们对其进行右移并且进行或运算。

先将0001****右移1位
得到00001***,再与自身进行或运算
得到00011***

再将00011***右移2位
得到0000011*,再与自身进行或运算
得到0001111*

再将0001111*右移4位
得到00000001,再与自身进行或运算
得到00011111

后面不用再推算了,到这里我们其实可以发现一个规律:右移与或运算的目的就是想让某个数字的低位都变为1,再用该结果 减去 该结果逻辑右移一位后的结果,则相当于清零了原数字的低位。即得到了我们想要的结果。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值