~drizzle-trunk/drizzle/development

« back to all changes in this revision

Viewing changes to mysys/my_bit.h

  • Committer: Brian Aker
  • Date: 2008-11-04 15:39:09 UTC
  • mfrom: (575.1.2 devel)
  • Revision ID: brian@tangent.org-20081104153909-c72hn65udxs1ccal
Merge of Monty's work

Show diffs side-by-side

added added

removed removed

Lines of Context:
2
2
  Some useful bit functions
3
3
*/
4
4
 
5
 
C_MODE_START
 
5
#ifdef __cplusplus
 
6
extern "C" {
 
7
#endif
6
8
 
7
9
extern const char _my_bits_nbits[256];
8
 
extern const uchar _my_bits_reverse_table[256];
 
10
extern const unsigned char _my_bits_reverse_table[256];
9
11
 
10
12
/*
11
13
  Find smallest X in 2^X >= value
12
14
  This can be used to divide a number with value by doing a shift instead
13
15
*/
14
16
 
15
 
static inline uint my_bit_log2(uint32_t value)
 
17
static inline uint32_t my_bit_log2(uint32_t value)
16
18
{
17
 
  uint bit;
 
19
  uint32_t bit;
18
20
  for (bit=0 ; value > 1 ; value>>=1, bit++) ;
19
21
  return bit;
20
22
}
21
23
 
22
 
static inline uint my_count_bits(uint64_t v)
 
24
static inline uint32_t my_count_bits(uint64_t v)
23
25
{
24
 
#if SIZEOF_LONG_LONG > 4
25
26
  /* The following code is a bit faster on 16 bit machines than if we would
26
27
     only shift v */
27
28
  uint32_t v2=(uint32_t) (v >> 32);
28
 
  return (uint) (uchar) (_my_bits_nbits[(uchar)  v] +
29
 
                         _my_bits_nbits[(uchar) (v >> 8)] +
30
 
                         _my_bits_nbits[(uchar) (v >> 16)] +
31
 
                         _my_bits_nbits[(uchar) (v >> 24)] +
32
 
                         _my_bits_nbits[(uchar) (v2)] +
33
 
                         _my_bits_nbits[(uchar) (v2 >> 8)] +
34
 
                         _my_bits_nbits[(uchar) (v2 >> 16)] +
35
 
                         _my_bits_nbits[(uchar) (v2 >> 24)]);
36
 
#else
37
 
  return (uint) (uchar) (_my_bits_nbits[(uchar)  v] +
38
 
                         _my_bits_nbits[(uchar) (v >> 8)] +
39
 
                         _my_bits_nbits[(uchar) (v >> 16)] +
40
 
                         _my_bits_nbits[(uchar) (v >> 24)]);
41
 
#endif
 
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)]);
42
37
}
43
38
 
44
 
static inline uint my_count_bits_ushort(ushort v)
 
39
static inline uint32_t my_count_bits_uint16(uint16_t v)
45
40
{
46
41
  return _my_bits_nbits[v];
47
42
}
97
92
     _my_bits_reverse_table[(key>>24)      ];
98
93
}
99
94
 
100
 
C_MODE_END
 
95
#ifdef __cplusplus
 
96
}
 
97
#endif
 
98