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。太好了。