我在java中找到了Integer 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);
}
我需要一段时间才能理解,这是我的解决方案:
public static int numberOfTrailingZeros(int i) {
if (i == 0) return 32;
int num = 0;
while ((i & 1) == 0) {
i >>= 1;
num ++;
}
return num;
}
我的问题是什么是更好的解决方案?我怎样才能提出这些工具,如JDK Integer bitCount,highestOneBit,rotateLeft等方法? 我知道JDK的numberOfTrailingZeros使用less + opeartor,并且在处理'0x70000000','0x60000000'等等时会有更高的性能吗?
答案 0 :(得分:2)
java JDK正在做的是在数字中进行二元搜索,以查找尾随零的数量。它试图将剩余的数字移动2,以查看移位的数字是否变为0.如果没有,则有一些设置位远离右侧,因此该方法保持该移位数,减少最终数量计数,然后再次尝试下一个最小的2次幂。