00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #pragma once
00025
00026 namespace drizzled
00027 {
00028 namespace internal
00029 {
00030
00031 extern const char _my_bits_nbits[256];
00032 extern const unsigned char _my_bits_reverse_table[256];
00033
00034
00035
00036
00037
00038
00039 static inline uint32_t my_bit_log2(uint32_t value)
00040 {
00041 uint32_t bit;
00042 for (bit=0 ; value > 1 ; value>>=1, bit++) ;
00043 return bit;
00044 }
00045
00046 static inline uint32_t my_count_bits(uint64_t v)
00047 {
00048
00049
00050 uint32_t v2=(uint32_t) (v >> 32);
00051 return (uint32_t) (unsigned char) (_my_bits_nbits[(unsigned char) v] +
00052 _my_bits_nbits[(unsigned char) (v >> 8)] +
00053 _my_bits_nbits[(unsigned char) (v >> 16)] +
00054 _my_bits_nbits[(unsigned char) (v >> 24)] +
00055 _my_bits_nbits[(unsigned char) (v2)] +
00056 _my_bits_nbits[(unsigned char) (v2 >> 8)] +
00057 _my_bits_nbits[(unsigned char) (v2 >> 16)] +
00058 _my_bits_nbits[(unsigned char) (v2 >> 24)]);
00059 }
00060
00061 static inline uint32_t my_count_bits_uint16(uint16_t v)
00062 {
00063 return _my_bits_nbits[v];
00064 }
00065
00066
00067 static inline uint32_t my_clear_highest_bit(uint32_t v)
00068 {
00069 uint32_t w=v >> 1;
00070 w|= w >> 1;
00071 w|= w >> 2;
00072 w|= w >> 4;
00073 w|= w >> 8;
00074 w|= w >> 16;
00075 return v & w;
00076 }
00077
00078 static inline uint32_t my_reverse_bits(uint32_t key)
00079 {
00080 return
00081 (_my_bits_reverse_table[ key & 255] << 24) |
00082 (_my_bits_reverse_table[(key>> 8) & 255] << 16) |
00083 (_my_bits_reverse_table[(key>>16) & 255] << 8) |
00084 _my_bits_reverse_table[(key>>24) ];
00085 }
00086
00087 }
00088 }
00089