2
2
Some useful bit functions
9
8
extern const char _my_bits_nbits[256];
10
extern const unsigned char _my_bits_reverse_table[256];
9
extern const uchar _my_bits_reverse_table[256];
13
12
Find smallest X in 2^X >= value
14
13
This can be used to divide a number with value by doing a shift instead
17
static inline uint32_t my_bit_log2(uint32_t value)
16
STATIC_INLINE uint my_bit_log2(ulong value)
20
19
for (bit=0 ; value > 1 ; value>>=1, bit++) ;
24
static inline uint32_t my_count_bits(uint64_t v)
23
STATIC_INLINE uint my_count_bits(ulonglong v)
25
#if SIZEOF_LONG_LONG > 4
26
26
/* The following code is a bit faster on 16 bit machines than if we would
28
uint32_t v2=(uint32_t) (v >> 32);
29
return (uint) (unsigned char) (_my_bits_nbits[(unsigned char) v] +
30
_my_bits_nbits[(unsigned char) (v >> 8)] +
31
_my_bits_nbits[(unsigned char) (v >> 16)] +
32
_my_bits_nbits[(unsigned char) (v >> 24)] +
33
_my_bits_nbits[(unsigned char) (v2)] +
34
_my_bits_nbits[(unsigned char) (v2 >> 8)] +
35
_my_bits_nbits[(unsigned char) (v2 >> 16)] +
36
_my_bits_nbits[(unsigned char) (v2 >> 24)]);
28
ulong v2=(ulong) (v >> 32);
29
return (uint) (uchar) (_my_bits_nbits[(uchar) v] +
30
_my_bits_nbits[(uchar) (v >> 8)] +
31
_my_bits_nbits[(uchar) (v >> 16)] +
32
_my_bits_nbits[(uchar) (v >> 24)] +
33
_my_bits_nbits[(uchar) (v2)] +
34
_my_bits_nbits[(uchar) (v2 >> 8)] +
35
_my_bits_nbits[(uchar) (v2 >> 16)] +
36
_my_bits_nbits[(uchar) (v2 >> 24)]);
38
return (uint) (uchar) (_my_bits_nbits[(uchar) v] +
39
_my_bits_nbits[(uchar) (v >> 8)] +
40
_my_bits_nbits[(uchar) (v >> 16)] +
41
_my_bits_nbits[(uchar) (v >> 24)]);
39
static inline uint32_t my_count_bits_uint16(uint16_t v)
45
STATIC_INLINE uint my_count_bits_ushort(ushort v)
41
47
return _my_bits_nbits[v];
61
67
Comments shows how this works with 01100000000000000000000000001011
64
static inline uint32_t my_round_up_to_next_power(uint32_t v)
70
STATIC_INLINE uint32 my_round_up_to_next_power(uint32 v)
66
72
v--; /* 01100000000000000000000000001010 */
67
73
v|= v >> 1; /* 01110000000000000000000000001111 */
92
98
_my_bits_reverse_table[(key>>24) ];
101
#else /* HAVE_INLINE */
102
extern uint my_bit_log2(ulong value);
103
extern uint32 my_round_up_to_next_power(uint32 v);
104
uint32 my_clear_highest_bit(uint32 v);
105
uint32 my_reverse_bits(uint32 key);
106
extern uint my_count_bits(ulonglong v);
107
extern uint my_count_bits_ushort(ushort v);
108
#endif /* HAVE_INLINE */