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

Php 位模式中真值(1)的第一个位置,php,bit-manipulation,Php,Bit Manipulation,例如,如果模式如下所示: bit [10010][1011][1000] position 54321 4321 4321 result 2 1 4 我想得到从右到左的结果,如[2][1][4]假设位模式由int表示,您可以执行如下操作 if(bitPattern == 0) { return 0; } int count = 1; while(bitPattern % 2 == 0) { bitPattern >

例如,如果模式如下所示:

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

我想得到从右到左的结果,如
[2][1][4]

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

if(bitPattern == 0) {
    return 0;
}

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

如果我正确理解了您的问题,那么您正在寻找一个返回整数中最低有效1位索引的函数。如果是,请检查您的平台是否实现了功能
ffs()
(“查找第一组”)。在Linux上,您可以执行
manffs
来获取完整的文档。在其他编程平台上,该函数的命名可能不同,例如在NVIDIA的CUDA中,它作为设备函数存在 ~x+1与-x完全相同,是2的补码的结果。那么,为什么要使用更复杂、更慢的方法呢

还有许多比特黑客可以快速找到整数log2x,而不是像上面那样使用更慢的浮点日志。也不需要慢慢划分。因为x&-x只产生最后一位,它是2的幂,所以可以使用下面的函数来获得log2

unsigned int log2p2(unsigned int v)//32位值,用于查找v的log2
{
静态常量unsigned int b[]={0xAAAAAAAA,0xcccccc,0xf0f0f0,
0xFF00FF00,0xFFFF0000};
寄存器无符号整数r=(v&b[0])!=0;
对于(i=4;i>0;i--)//展开以获得速度。。。
{

r |=((v&b[i])!=0)什么语言?您的模式是字符串吗?显示示例代码和您迄今为止的尝试。我想使用位存储如下内容:数组('php'=>36/*'0100100'*/)。'php'是搜索键,'0100100100'表示哪篇文章有php键世界。我如何获得第一个位置(3)真值1的形式为“0100100”。谢谢大家,现在我使用代码“$n=log($x&(~$x+1))/log(2)”。+1并警告说
bitPattern=0
将导致无限循环。您需要先检查
0
值。如果位模式为“10000000000000000000000000000”,它将执行31次循环。@nroe:可能有更好的方法,但这是最坏的情况。@nroe:只有一个移位和一个增量的循环非常紧凑。条件甚至可能是
while(位模式&1==0)
哪一个更好。@安德鲁·库珀:我知道它会很快。但是如果a有一百万位。当它们有很多假值(0)thx时,它会产生很多循环,我找到代码,然后转换到php。太好了。