int FUNC (TYPE x) { #if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) if (x == 0) return 0; else return NBITS - GCC_BUILTIN (x); #else /* Split x into chunks, and look at one chunk after the other. */ if (sizeof (TYPE) > 2 * sizeof (unsigned int)) { /* Generic loop. */ size_t i; for (i = (sizeof (TYPE) - 1) / sizeof (unsigned int); i >= 2; i--) { unsigned int y = x >> (i * sizeof (unsigned int) * CHAR_BIT); if (y != 0) return i * sizeof (unsigned int) * CHAR_BIT + integer_length (y); } }
constexpr unsigned int integer_length(long long i) { long long i_ = i / 10; return i_ == 0 ? 1 : 1 + integer_length(i_); }