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);
}
注:
>> 数据右移,补的是符号位
>>>逻辑右移,补的是零
其实不明白一个方法的用途时,最好的方式就是多带入几组数据看看
- 假设参数 i = 0时, highestOneBit(0)
结果很显然 ,返回的结果也是0 - 当参数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
同过本人朴实无华的英语水平可以将它翻译成 最高的一位
- 当 i < 0时 一定返回0100 0000 0000 0000 0000 0000 0000 0000
我们会发现1出现在除了符号位外的最高一位 - 当 i = 0时 一定返回0
- 当i > 0 时,将在二进制的情况下的非最高位变为0,即只保留最高位,最终结果就是返回值。
比如 13(D)= 1101(B)将非最高位全变为0的 1000(B)= 8(D)
从此可见这个方法的名字取的是多么的好