获得比特位置的最快解决方案

时间:2013-11-21 12:52:39

标签: c bit

我想知道它所在位的位置,到目前为止I wrote the following code

unsigned long a = 0x0102C121;
int pos = 0;
printf("%x\r\n", a);
while(a)
{       
    if(a & 0x1)
        //Handling the position, right now just printing the position
        printf("Position:%d\r\n", pos);

    a >>= 1;
    ++pos;        
}
printf("Loop number:%d\r\n", pos);

我想知道是否有更好/更快的解决方案?

3 个答案:

答案 0 :(得分:2)

您可以展开while循环以摆脱循环开销和位移和增量,如下所示:

unsigned long a = 0x0102C121;
int pos = 0;
printf("%x\r\n", a);

if(a & 0x1) printf("Position:%d\r\n", 0);
if(a & 0x2) printf("Position:%d\r\n", 1);
if(a & 0x4) printf("Position:%d\r\n", 2);
...
if(a & 0x80000000) printf("Position:%d\r\n", 31);

它看起来很丑,但会更快,但是如果你有太多的代码来处理你的每一个位置,它可能会丢弃你的指令缓存。

答案 1 :(得分:1)

如果你在循环中调用printf,那么输出函数的复杂性将淹没任何更快的位错误。

如果你想知道设置了什么位,那么还有其他方法,但这很大程度上取决于算法的其余部分对信息的作用。

不值得优化'为每个位集执行某些操作',但如果bit twiddling hacks archive中只设置了一个,则可以优化计数设置的位数或查找位集的索引。< / p>

答案 2 :(得分:0)

我找到了另一种方法来强制执行以找到位数。我总觉得我们会浪费很多时间检查每一位是否设置。

我们可以检查整个半字节(或字节),而不是检查每个位,以查看是否在该半字节(或字节)中设置了任何位。如果检查结果为真,那么我们可能需要以正常方式检查以获得该位置。

通过这种方式,我们将消除不必要的检查。

执行此操作的示例代码是

而(TEMP)   {

if (! ((char)temp & 0xff ) ) 

 /*Checks bitwise if any of the bits are set in 8 bits ..*/

 temp = temp >> 8;

 else        /*Our bit check logic */

}