在Java Primitive中查找最高顺序1

two*_*e18 7 java bit-manipulation

我需要在Java中的一些long,int和short中找到最高阶1.例如,如果我有一个看起来像的char 00110101,我需要一个返回2的方法(最高阶1的索引).

现在,我知道您可以使用for循环执行此操作,如:

for(int i=0; i<8; i++)
    if((x & 1<<i) != 0) return i;
return -1;
Run Code Online (Sandbox Code Playgroud)

但这比我想做的慢.我知道现代CPU有指令在芯片上执行此操作,所以我想知道如何调用它而不是有一个显式循环.

编辑:如果你可以返回原语中所有的索引,就可以获得奖励积分.

谢谢.

mer*_*ike 14

Integer.numberOfLeadingZeros(i) + 1

该方法采用了一种很好的分而治之的方法,在此复制供您查看:

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;
}
Run Code Online (Sandbox Code Playgroud)

  • 在Java中是否存在改变"非常慢"的参考?我从来没有听说过. (4认同)