/* Returns the number of high-order 0-bits in X. Undefined if X is zero. */ static inline int count_leading_zeros (size_t x) { #if __GNUC__ >= 4 #if SIZE_MAX > ULONG_MAX return __builtin_clzll (x); #elif SIZE_MAX > UINT_MAX return __builtin_clzl (x); #else return __builtin_clz (x); #endif #else /* This algorithm is from _Hacker's Delight_ section 5.3. */ size_t y; int n; #define COUNT_STEP(BITS) \ y = x >> BITS; \ if (y != 0) \ { \ n -= BITS; \ x = y; \ } n = sizeof (size_t) * CHAR_BIT; #if SIZE_MAX >> 31 >> 31 >> 2 COUNT_STEP (64); #endif #if SIZE_MAX >> 31 >> 1 COUNT_STEP (32); #endif COUNT_STEP (16); COUNT_STEP (8); COUNT_STEP (4); COUNT_STEP (2); y = x >> 1; return y != 0 ? n - 2 : n - x; #endif }
/* Returns the number of high-order 0-bits in X. Undefined if X is zero. */ static size_t count_leading_zeros (size_t x) { /* This algorithm is from _Hacker's Delight_ section 5.3. */ size_t y; size_t n; #define COUNT_STEP(BITS) y = x >> BITS; if (y != 0){n -= BITS; x = y; } n = sizeof (size_t) * CHAR_BIT; #if SIZE_MAX >> 31 >> 31 >> 2 COUNT_STEP (64); #endif #if SIZE_MAX >> 31 >> 1 COUNT_STEP (32); #endif COUNT_STEP (16); COUNT_STEP (8); COUNT_STEP (4); COUNT_STEP (2); y = x >> 1; return y != 0 ? n - 2 : n - x; }