位编号 - 查找第一组(FFS)或查找第一个(FFO)Java


for (int i = 32; i <= 127; i++) {
}

i将数字int 32转换为二进制数字00100000,将数字int 127转换为二进制01111111。我需要从右读取的第一个位置(位编号 - 查找第一组(FFS)或查找第一个(FFO)),00100000-> 6和011111111-> 1

>

谢谢!

API也是您的朋友:

static int position(int a){
    int pos = Integer.numberOfTrailingZeros(a);
    return pos == 32 ? -1 : pos;
}

找到此数字的简单方法如下:

int findLowestSetBit(int n) {
    for (int i = 0 ; i != 32 ; i++) {
        if ((n & (1 << i)) != 0) {
            return i;
        }
    }
    return -1;
}

但是,它不是最快的,因为它搜索了一个"线性"位。您可以与从BIT HACK页面复制的以下代码并行执行此操作:

int v;      // 32-bit word input to count zero bits on right
int c = 32; // c will be the number of zero bits on the right
v &= -v;
if (v != 0) c--;
if ((v & 0x0000FFFF) != 0) c -= 16;
if ((v & 0x00FF00FF) != 0) c -= 8;
if ((v & 0x0F0F0F0F) != 0) c -= 4;
if ((v & 0x33333333) != 0) c -= 2;
if ((v & 0x55555555) != 0) c -= 1;

找到一个领先的零,您可以使用递归&amp;位偏移

我在此处发布了类似问题的答案:

计数引导零(CLZ)或JAVA中的领先零(NLZ)数量

或使用神&amp;征服算法在这里有一些示例:

如何计算32位整数中的设置位数?

最新更新