一,算法功能
实现的功能如下:
floor(log2(x)) = 31 - numberOfLeadingZeros(x) [x为大于0的数]
ceil(log2(x)) = 32 - numberOfLeadingZeros(x - 1)[x为大于0的数]
其实就是找出下面有多少个连续的0
二,实际业务
1.有一个队有32人,分别标记为:1,2,3,4....32
2.从第一个人开始,找出n个男的,直到遇到第一个女的,则停止查找
三,源码
二分法查找
注意
i >>> 16 这个操作不会导致i值的变化
public static int numberOfLeadingZeros(int i) {
// HD, Figure 5-6
if (i == 0)
return 32;
int n = 1;
if (i >>> 16 == 0) { n += 16; i <<= 16; }
if (i >>> 24 == 0) { n += 8; i <<= 8; }
if (i >>> 28 == 0) { n += 4; i <<= 4; }
if (i >>> 30 == 0) { n += 2; i <<= 2; }
n -= i >>> 31;
return n;
}
四,注意
要能区分开java的 Math的 ceil,round,floor的区别
- floor (沿着x轴,向左找到第一个整数,包含自身)
- ceil (沿着x轴,向右找到第一个整数,包含自身)
- round (四舍五入)