kernel中有个宏ffs,是用于从一个数中找出第一个为1的位(由低到高),为了提高效率,用了汇编指令实现。
static inline int fls(int x)
{
int ret;
if (__builtin_constant_p(x))
return constant_fls(x);
asm("clz\t%0, %1" : "=r" (ret) : "r" (x));
ret = 32 - ret;
return ret;
}
#define ffs(x) ({ unsigned long __t = (x); fls(__t & -__t); })
在其它应用中,由于不需要考虑效率问题,可以采用其他方式实现:
#define ffs(x) ({\
unsigned long i = 0;\
if(x == 0)\
i = 32;\
else {\
while((x & (1<<i)) == 0)\
{\
i ++;\
}\
i++;\
}\
i;})