位模式中真值(1)的第一个位置


First position of true value(1) from a bit pattern

例如,模式如下:

bit        [10010][1011][1000]
position    54321  4321  4321  
result         2      1  4

我想从右到左得到结果为[2] [1] [4]

如果我正确理解你的问题,你正在寻找一个函数,返回整数中最不重要的1位的索引。如果是,检查您的平台是否实现了ffs()函数("查找第一个集合")。在Linux上,您可以执行man ffs以获得完整的文档。在其他编程平台上,该函数可能会以不同的方式命名,例如在NVIDIA的CUDA中,它作为设备函数__ffs()存在。

假设位模式由int型表示,您可以执行如下操作

if(bitPattern == 0) {
    return 0;
}
int count = 1;
while(bitPattern % 2 == 0) {
    bitPattern >>= 1;
    count++;
}
return count;
$n = log($x & (~$x+1))/log(2)

~x + 1与-x完全相同,作为2的补数的结果。那么为什么要用更复杂、更慢的呢?

还有很多方法可以快速找到整数log2x,而不是像上面那样使用更慢的浮点对数。也不需要慢慢划分。Since x &-x只产生最后一位,即2的幂,您可以使用以下函数获得log2

unsigned int log2p2(unsigned int v)  // 32-bit value to find the log2 of v
{
    static const unsigned int b[] = {0xAAAAAAAA, 0xCCCCCCCC, 0xF0F0F0F0, 
                                     0xFF00FF00, 0xFFFF0000};
    register unsigned int r = (v & b[0]) != 0;
    for (i = 4; i > 0; i--) // unroll for speed...
    {
        r |= ((v & b[i]) != 0) << i;
    }
}

还有很多其他的方法来计算log2x,你可以在这里找到

现在你的代码就是

log2p2(x & -x);