源码如下:
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 这个数的二进制形式最左边的最高一位且高位后面全部补零,最后返回int型的结果。
首先了解一下出现的一些符号
1. “>>” 右移
i>>a:i的二进制最高位向右移动a位。i是正数,最高位补0;i是负数,最高位补1
2. “|” 或运算
a|=b即a=a|b:a和b的二进制做或运算操作,结果给a
3.“>>>” 无符号右移
i>>>a: i的最高位向右移动a位。最高位补0
实现原理:
i |= (i >> 1):将最高位向右移动一位,做或运算。结果最高位和最高位后一位均为1。其他位可暂时忽略。
i |= (i >> 2):将最高位向右移动两位,做或运算。由于最高位和最高位后一位均为1,右移两位再去或运算,意味着最高最和后面的三位均为1.
以此类推,运算完 i |= (i >> 16);后,i的最高位后面的位值均为1.(因为int占16位,如果是long的话,需要运算到32位)
i - (i >>> 1) 最终得到的i是从开始的最高位到结束全是1。并减去i不带符号的右移一位,即可得到一个int数据的最高位的值
上述情况是针对于i不为零和负数的情况,如果i为零,那么得到的结果始终为零。如果i位负数,那么得到的结果始终是-2147483648。即等于Integer.MIN_VALUE。(原因在于负数的最高位始终为1,即是负数的符号位)