【java】highestOneBit(int i)方法解读

highestOneBit()方法解读

前言

highestOneBit()方法是属于Integer类中的静态方法,小博主在阅读Jdk1.7版本的HashMap源码是遇到了这个方法

正片

方法源码

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

注:
>> 数据右移,补的是符号位
>>>逻辑右移,补的是零

其实不明白一个方法的用途时,最好的方式就是多带入几组数据看看

  1. 假设参数 i = 0时, highestOneBit(0)
    结果很显然 ,返回的结果也是0
  2. 当参数i < 0 时,即符号位为1
		i |= (i >>  1);  
        i |= (i >>  2);
        i |= (i >>  4);
        i |= (i >>  8);
        i |= (i >> 16);
        //i是一个int类型的数据,当i为负数时,不管i是多少,只要执行到这里时,i的32位都为1
        //即 i= -2147483648    (i >>> 1)
        /*
         -2147483648 补码为 1000 0000 0000 0000 0000 0000 0000 0000
         i >>> 1 = 补码     0100 0000 0000 0000 0000 0000 0000 0000
         i - (i >>> 1) 
         => 补码1000 0000 0000 0000 0000 0000 0000 0000 -
            补码0100 0000 0000 0000 0000 0000 0000 0000 
            ——————————————————————————————————————————————
        	补码0100 0000 0000 0000 0000 0000 0000 0000
		化为源码0100 0000 0000 0000 0000 0000 0000 0000	
		将源码化为十进制为1073741824
        return i - (i >>> 1);
        //最终返回1073741824

3**.当i > 0时,这次说一个简单的数,比如13**
13(D)= 1101(B)

 i |= (i >>  1); //i = 1111
 i |= (i >>  2); //i = 1111
 i |= (i >>  4); //i = 1111
 i |= (i >>  8); //i = 1111
 i |= (i >> 16); //i = 1111
 return i - (i >>> 1); //返回 1000(B) = 8(D)

当参数大于0时,返回小于等于参数的最接近2的幂次方
比如 当参数为 13时,小于等于13,最接近的2的幂次方是8
当参数为 21时,小于等于21,最接近的2的幂次方是16

总结

highestOneBit(int i)方法

参数 i返回值
i < 0返回1073741824,这个数在二进制层面本质是除了符号位外的最高位为1,剩下的低30位都为0
i = 0返回0
i > 0返回小于等于参数并且最接近参数的2的幂次方

其实通过这个方法名我们就可以在得知这个方法的作用
highestOneBit => highest One Bit
同过本人朴实无华的英语水平可以将它翻译成 最高的一位

  1. 当 i < 0时 一定返回0100 0000 0000 0000 0000 0000 0000 0000
    我们会发现1出现在除了符号位外的最高一位
  2. 当 i = 0时 一定返回0
  3. 当i > 0 时,将在二进制的情况下的非最高位变为0,即只保留最高位,最终结果就是返回值。
    比如 13(D)= 1101(B)将非最高位全变为0的 1000(B)= 8(D)

从此可见这个方法的名字取的是多么的好

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值