工作中突然遇到这个需求,需大量调用。采用二分法的思想,u32类型数据经过5次查找可以查找出来,相较于逐位移位,整体效率高一些,仅作参考。
int find_first(unsigned int num)
{
unsigned int mask[5] = {0xffff, 0xff, 0xf, 0x3, 0x1};
int shift[5] = {16, 8, 4, 2, 1};
int idx = 0;
if (num == 0) {
return -1;
}
for (int i = 0; i < 5; i++)
{
if ((num & mask[i]) == 0)
{
num >>= shift[i];
idx += shift[i];
}
}
return idx;
}