Integer.numberOfLeadingZeros
public static int numberOfLeadingZeros(int i) {
if (i == 0)
return 32;
int n = 1;
if (i >>> 16 == 0) { n += 16; i <<= 16; } //1 i的高16位为0
if (i >>> 24 == 0) { n += 8; i <<= 8; } //2 i的高8位为0
if (i >>> 28 == 0) { n += 4; i <<= 4; } //3 i的高4位为0
if (i >>> 30 == 0) { n += 2; i <<= 2; } //4 i的高2位为0
n -= i >>> 31;
return n;
}
功能:获取i的二进制串中从最左边算起连续的0的总数量
解析:使用二分法的思路,int类型的二进制串共32位,首先从中间值16开始判断。
1,2,3,4的判断属于层层递进的关系,前者不满足就不会进行后者判断
假设i=ABCDEFGH,从左开始记数,A代表0—4位,以此类推
第一次判断i>>>16==0,判断0—16位是否为0。第一次判断后i=EFGH0000。ABCD不再关心
第二次判断i>>>24==0,i>>>24=000000EF。即进一步判断16—24位(对于i的原值而言)是否为0。第二次判断后i=GH000000。EF不再关心
第三次判断i>>>28==0,i>>>28=0000000G。即进一步判断24—28位是否为0。
。。。。。。以此类推
如果判断全部满足,i最后等于i<<30,n=31。
最后i>>>31即判断31位是否为0
31位为0,n=31。否则n=30