这个函数返回一个int值,这个值代表num的最高位为1,其它位为0的整数,负数的最高位在第32位上,所以通常只用于负数。
源码解析:
从左往右数称之为前。
把最右边的位数都变为1,最后i-(i>>>1)得到只保留最高位的结果。
public static int highestOneBit(int i) {
// 例如1000
i |= (i >> 1); // 使前2位变为1,相当于i = i | (i >> 1); i = 1000 | 0100 = 1100
i |= (i >> 2); // 使前4位变为1,由于上一步确保了前两位都是1,所以这一次移动两位,1111
i |= (i >> 4); // 使前8位变为1,1111
i |= (i >> 8); // 使前16位变为1,1111
i |= (i >> 16); // 使前32位变为1,1111
return i - (i >>> 1); // i >>> 1 无符号右移,使最高位为0,其余位为1,相减即得出结果,1111 - 0111 = 1000
}
或运算 使得 有1则1,那么我们先使1位为1,然后两位,然后四位,以此类推。