31 lines
535 B
C
31 lines
535 B
C
#ifndef COM_BITS_H
|
|
#define COM_BITS_H
|
|
|
|
#include "def.h"
|
|
#include <assert.h>
|
|
#include <stdint.h>
|
|
|
|
/* How many bits needed to represent a given number */
|
|
/* Alternitive semntic: nearest upper power of two */
|
|
static inline int com_bits_needed(uint32_t v) {
|
|
#ifdef COM_DEF_COMPILE_MODERN
|
|
/* Use intrinsic, required for fast sqrt impl */
|
|
return v == 0 ? 1 : 32 - __builtin_clz(v);
|
|
#else
|
|
#endif
|
|
if (v == 0)
|
|
return 1;
|
|
|
|
v--;
|
|
v |= v >> 1;
|
|
v |= v >> 2;
|
|
v |= v >> 4;
|
|
v |= v >> 8;
|
|
v |= v >> 16;
|
|
v++;
|
|
|
|
return v;
|
|
}
|
|
|
|
#endif
|