/* * Copyright (C) 2002 Manuel Novoa III * Copyright (C) 2000-2005 Erik Andersen <andersen@uclibc.org> * * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball. */ /* ffsl,ffsll */ #include "_string.h" libc_hidden_proto(ffs) int ffs(int i) { #if 1 /* inlined binary search method */ char n = 1; #if UINT_MAX == 0xffffU /* nothing to do here -- just trying to avoiding possible problems */ #elif UINT_MAX == 0xffffffffU if (!(i & 0xffff)) { n += 16; i >>= 16; } #else #error ffs needs rewriting! #endif if (!(i & 0xff)) { n += 8; i >>= 8; } if (!(i & 0x0f)) { n += 4; i >>= 4; } if (!(i & 0x03)) { n += 2; i >>= 2; } return (i) ? (n + ((i+1) & 0x01)) : 0; #else /* linear search -- slow, but small */ int n; for (n = 0 ; i ; ++n) { i >>= 1; } return n; #endif } libc_hidden_def(ffs)