1. 源码
public static int numberOfLeadingZeros(int i) {
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;
}
2. 方法功能
Returns the number of zero bits preceding the highest-order
("leftmost") one-bit in the two's complement binary representation
of the specified {@code int} value. Returns 32 if the
specified value has no one-bits in its two's complement representation,
in other words if it is equal to zero.
翻译: 返回int类型32位补码值最左边出现的1之前的0的个数,如果是0因为没有1,就返回32
举个栗子: 10的补码为 0000 0000 0000 0000 0000 0000 0000 1010,则最左边1之前有28个0,所以此方法返回28.
3. 源码分析
- 0的情况返回32
- 中间部分实际上是二分法的应用,比如第一个判断如果成立,表示第一个非零值位于低16位,然后再将i值左移16位使得第一个非零值到达高16位进入第二个判断。依次律推进行二分。
- 还有一个巧妙的地方就是n初始化值为1,因此到了最后一步i>>>>31如果是1,那么n就减1,如果为0就不变。
作者 @没有故事的老大爷
别想太多,想不过来