// 这个处理逻辑很符合二分搜索树。
public static int numberOfLeadingZeros(int i) {
// HD, Figure 5-6
if (i == 0)
return 32;
// 为什么是1呢?因为如果i不是0,那么就表明在二进制表示中其至少有一位为1。
int n = 1;
// 如果 i 无符号右移 16位成立,那么就表示i的前16为0,这是就可以对n进行+16(32-16)的操作,然后
// 再将i左移16位,这个主要是将低位的数值移到高位去进行处理
if (i >>> 16 == 0) { n += 16; i <<= 16; }
// 如果 i 无符号右移 24位成立,那么就表示前24位为0,这时就可以对n进行+8操作(加8操作的来源是:
// 32 - 24 得来的),接着将i左移8位,这样就把24位的0覆盖掉,将低位数字移到高位来进行处理
if (i >>> 24 == 0) { n += 8; i <<= 8; }
// 一样的逻辑来进行处理(加4的来源是:32-28)
if (i >>> 28 == 0) { n += 4; i <<= 4; }
// 一样的逻辑(加2的来源是:32-30)
if (i >>> 30 == 0) { n += 2; i <<= 2; }
n -= i >>> 31;
return n;
}
该方法的作用是返回无符号整数i的最高非0位前面的0的个数,包括符号位在内;如果i为负数,这个方法将会返回0,符号位为1。
比如说,10的二进制表示为 0000 0000 0000 0000 0000 0000 0000 1010
java的整型长度为32位。那么这个方法返回的就是28