1
  
2
  
3
  
4
  
5
  
6
  
7
  
8
  
9
  
10
  
11
  
12
  
13
  
14
  
15
  
16
  
17
  
18
  
19
  
20
  
21
  
22
  
23
  
24
  
25
  
26
  
27
  
28
  
29
  
30
  
31
  
32
  
33
  
34
  
35
  
36
  
37
  
38
  
39
  
40
  
41
  
42
  
43
  
44
  
45
  
46
  
47
  
48
  
49
  
50
  
51
  
52
  
53
  
54
  
55
  
56
  
57
  
58
  
59
  
60
  
61
  
62
  
63
  
64
  
65
  
66
  
67
  
68
  
69
  
70
  
71
  
72
  
73
  
74
  
75
  
/*\ 
||| This file a part of Pike, and is copyright by Fredrik Hubinette 
||| Pike is distributed as GPL (General Public License) 
||| See the files COPYING and DISCLAIMER for more information. 
\*/ 
#include "stuff.h" 
 
/* same thing as (int)floor(log((double)x) / log(2.0)) */ 
/* Except a bit quicker :) (hopefully) */ 
 
int my_log2(unsigned INT32 x) 
{ 
  static char bit[256] = 
  { 
    -1, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3,  
     4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,  
     5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,  
     5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,  
     6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,  
     6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,  
     6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,  
     6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,  
     7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,  
     7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,  
     7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,  
     7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,  
     7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,  
     7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,  
     7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,  
     7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,  
  }; 
  register unsigned int tmp; 
  if(tmp=(x>>16)) 
  { 
    if(x=(tmp>>8)) return bit[x]+24; 
    return bit[tmp]+16; 
  } 
  if(tmp=(x>>8)) return bit[tmp]+8; 
  return bit[x]; 
} 
 
 
/* Return the number of bits in a 32-bit integer */ 
int count_bits(unsigned INT32 x) 
{ 
#define B(X) X+0,X+1,X+1,X+2,\ 
             X+1,X+2,X+2,X+3,\ 
             X+1,X+2,X+2,X+3,\ 
             X+2,X+3,X+3,X+4 
  static char bits[256] = 
  { 
    B(0), B(1), B(1), B(2), 
    B(1), B(2), B(2), B(3), 
    B(1), B(2), B(2), B(3), 
    B(2), B(3), B(3), B(4) 
  }; 
 
  return (bits[x & 255] + 
          bits[(x>>8) & 255] + 
          bits[(x>>16) & 255] + 
          bits[(x>>24) & 255]); 
} 
 
/* Return true for integers with more than one bit set */ 
int is_more_than_one_bit(unsigned INT32 x) 
{ 
  return ((x & 0xaaaaaaaa) && (x & 0x55555555)) || 
         ((x & 0xcccccccc) && (x & 0x33333333)) || 
         ((x & 0xf0f0f0f0) && (x & 0x0f0f0f0f)) || 
         ((x & 0xff00ff00) && (x & 0x00ff00ff)) || 
         ((x & 0xff00ff00) && (x & 0x00ff00ff)) || 
         ((x & 0xffff0000) && (x & 0x0000ffff)); 
}