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

时间:2011-08-04 03:24:26

标签: php bit-manipulation

例如,如果模式如下:

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

我希望将结果从右到左位置为[2] [1] [4]

3 个答案:

答案 0 :(得分:1)

假设位模式由int表示,您可以执行类似

的操作
if(bitPattern == 0) {
    return 0;
}

int count = 1;
while(bitPattern % 2 == 0) {
    bitPattern >>= 1;
    count++;
}
return count;

答案 1 :(得分:1)

如果我正确理解了您的问题,那么您正在寻找一个函数,该函数返回整数中最低有效1位的索引。如果是,请检查您的平台是否实现了函数ffs()[“find first set”]。在Linux上,您可以执行“man ffs”来获取完整的文档。在其他编程平台上,该功能可以被不同地命名,例如,在NVIDIA的CUDA中,它作为设备函数存在__ffs()。

答案 2 :(得分:0)

$n = log($x & (~$x+1))/log(2)

~x + 1与-x完全相同,作为2的补码的结果。那么为什么你会使用更复杂和更慢的?

有很多bithacks可以快速找到整数log 2 x,而不是像上面那样使用更慢的浮点日志。也不需要缓慢分裂。从x& -x只产生2的幂的最后一位,你可以使用以下函数来获取log 2

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;
    }
}

还有很多其他方法可以计算log 2 x,你可以找到它here

所以你的代码现在只是

log2p2(x & -x);