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-...