numberOfTrailingZeros
public static int numberOfTrailingZeros(int i) {
// HD, Figure 5-14
int y;
if (i == 0) return 32;
int n = 31;
y = i <<16; if (y != 0) { n = n -16; i = y; }
y = i << 8; if (y != 0) { n = n - 8; i = y; }
y = i << 4; if (y != 0) { n = n - 4; i = y; }
y = i << 2; if (y != 0) { n = n - 2; i = y; }
return n - ((i << 1) >>> 31);
}
说明: n为目前结果的最大值
y!= 0 表明高n(n = 16/8/4/2)位对结果不可贡献,要减去。
y==0 , 表明贡献,所以保留
examples:
numberOfLeadingZeros
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;
}
说明: n为目前结果的最大值
i >>> n == 0 表明高n(n=16/8/4/2)位对结果有贡献,要计入结果。
i >>> n != 0 , 表明无贡献,不计入结果
n 如果初始化为0,if(i>>>31 == 0) n++; 更易理解