我想知道它所在位的位置,到目前为止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);
我想知道是否有更好/更快的解决方案?
答案 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 */
}