Do you actually have a system that doesn't have HAVE_FFS set? On my machine,
int main(int argc, char **argv)
{
return ffs(argc);
}
compiles to
pushl %ebp
movl %esp, %ebp
movl $-1, %edx
bsfl 8(%ebp), %eax
cmove %edx, %eax
addl $1, %eax
popl %ebp
ret
which is probably pretty fast.
Large lookup tables can dirty the L1 cache and slow other things down.
See also
http://stackoverflow.com/questions/757059/position-of-least-significant-bit-that-is-set
