CMGDK r49-rc2
|
00001 / * 00002 00003 S o m e u s e f u l b i t f u n c t i o n s 00004 00005 * / 00006 00007 C _ M O D E _ S T A R T 00008 00009 # i f d e f H A V E _ I N L I N E 00010 00011 e x t e r n c o n s t c h a r _ m y _ b i t s _ n b i t s [ 2 5 6 ] ; 00012 00013 e x t e r n c o n s t u c h a r _ m y _ b i t s _ r e v e r s e _ t a b l e [ 2 5 6 ] ; 00014 00015 / * 00016 00017 F i n d s m a l l e s t X i n 2 ^ X > = v a l u e 00018 00019 T h i s c a n b e u s e d t o d i v i d e a n u m b e r w i t h v a l u e b y d o i n g a s h i f t i n s t e a d 00020 00021 * / 00022 00023 S T A T I C _ I N L I N E u i n t m y _ b i t _ l o g 2 ( u l o n g v a l u e ) 00024 00025 { 00026 00027 u i n t b i t ; 00028 00029 f o r ( b i t = 0 ; v a l u e > 1 ; v a l u e > > = 1 , b i t + + ) ; 00030 00031 r e t u r n b i t ; 00032 00033 } 00034 00035 S T A T I C _ I N L I N E u i n t m y _ c o u n t _ b i t s ( u l o n g l o n g v ) 00036 00037 { 00038 00039 # i f S I Z E O F _ L O N G _ L O N G > 4 00040 00041 / * T h e f o l l o w i n g c o d e i s a b i t f a s t e r o n 1 6 b i t m a c h i n e s t h a n i f w e w o u l d 00042 00043 o n l y s h i f t v * / 00044 00045 u l o n g v 2 = ( u l o n g ) ( v > > 3 2 ) ; 00046 00047 r e t u r n ( u i n t ) ( u c h a r ) ( _ m y _ b i t s _ n b i t s [ ( u c h a r ) v ] + 00048 00049 _ m y _ b i t s _ n b i t s [ ( u c h a r ) ( v > > 8 ) ] + 00050 00051 _ m y _ b i t s _ n b i t s [ ( u c h a r ) ( v > > 1 6 ) ] + 00052 00053 _ m y _ b i t s _ n b i t s [ ( u c h a r ) ( v > > 2 4 ) ] + 00054 00055 _ m y _ b i t s _ n b i t s [ ( u c h a r ) ( v 2 ) ] + 00056 00057 _ m y _ b i t s _ n b i t s [ ( u c h a r ) ( v 2 > > 8 ) ] + 00058 00059 _ m y _ b i t s _ n b i t s [ ( u c h a r ) ( v 2 > > 1 6 ) ] + 00060 00061 _ m y _ b i t s _ n b i t s [ ( u c h a r ) ( v 2 > > 2 4 ) ] ) ; 00062 00063 # e l s e 00064 00065 r e t u r n ( u i n t ) ( u c h a r ) ( _ m y _ b i t s _ n b i t s [ ( u c h a r ) v ] + 00066 00067 _ m y _ b i t s _ n b i t s [ ( u c h a r ) ( v > > 8 ) ] + 00068 00069 _ m y _ b i t s _ n b i t s [ ( u c h a r ) ( v > > 1 6 ) ] + 00070 00071 _ m y _ b i t s _ n b i t s [ ( u c h a r ) ( v > > 2 4 ) ] ) ; 00072 00073 # e n d i f 00074 00075 } 00076 00077 S T A T I C _ I N L I N E u i n t m y _ c o u n t _ b i t s _ u s h o r t ( u s h o r t v ) 00078 00079 { 00080 00081 r e t u r n _ m y _ b i t s _ n b i t s [ v ] ; 00082 00083 } 00084 00085 00086 00087 / * 00088 00089 N e x t h i g h e s t p o w e r o f t w o 00090 00091 S Y N O P S I S 00092 00093 m y _ r o u n d _ u p _ t o _ n e x t _ p o w e r ( ) 00094 00095 v V a l u e t o c h e c k 00096 00097 R E T U R N 00098 00099 N e x t o r e q u a l p o w e r o f 2 00100 00101 N o t e : 0 w i l l r e t u r n 0 00102 00103 N O T E S 00104 00105 A l g o r i t h m b y S e a n A n d e r s o n , a c c o r d i n g t o : 00106 00107 h t t p : / / g r a p h i c s . s t a n f o r d . e d u / ~ s e a n d e r / b i t h a c k s . h t m l 00108 00109 ( O r i g n a l c o d e p u b l i c d o m a i n ) 00110 00111 C o m m e n t s s h o w s h o w t h i s w o r k s w i t h 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 00112 00113 * / 00114 00115 S T A T I C _ I N L I N E u i n t 3 2 m y _ r o u n d _ u p _ t o _ n e x t _ p o w e r ( u i n t 3 2 v ) 00116 00117 { 00118 00119 v - - ; / * 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 * / 00120 00121 v | = v > > 1 ; / * 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 * / 00122 00123 v | = v > > 2 ; / * 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 * / 00124 00125 v | = v > > 4 ; / * 0 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 * / 00126 00127 v | = v > > 8 ; / * 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 1 1 1 1 * / 00128 00129 v | = v > > 1 6 ; / * 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 * / 00130 00131 r e t u r n v + 1 ; / * 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 * / 00132 00133 } 00134 00135 S T A T I C _ I N L I N E u i n t 3 2 m y _ c l e a r _ h i g h e s t _ b i t ( u i n t 3 2 v ) 00136 00137 { 00138 00139 u i n t 3 2 w = v > > 1 ; 00140 00141 w | = w > > 1 ; 00142 00143 w | = w > > 2 ; 00144 00145 w | = w > > 4 ; 00146 00147 w | = w > > 8 ; 00148 00149 w | = w > > 1 6 ; 00150 00151 r e t u r n v & w ; 00152 00153 } 00154 00155 S T A T I C _ I N L I N E u i n t 3 2 m y _ r e v e r s e _ b i t s ( u i n t 3 2 k e y ) 00156 00157 { 00158 00159 r e t u r n 00160 00161 ( _ m y _ b i t s _ r e v e r s e _ t a b l e [ k e y & 2 5 5 ] < < 2 4 ) | 00162 00163 ( _ m y _ b i t s _ r e v e r s e _ t a b l e [ ( k e y > > 8 ) & 2 5 5 ] < < 1 6 ) | 00164 00165 ( _ m y _ b i t s _ r e v e r s e _ t a b l e [ ( k e y > > 1 6 ) & 2 5 5 ] < < 8 ) | 00166 00167 _ m y _ b i t s _ r e v e r s e _ t a b l e [ ( k e y > > 2 4 ) ] ; 00168 00169 } 00170 00171 # e l s e / * H A V E _ I N L I N E * / 00172 00173 e x t e r n u i n t m y _ b i t _ l o g 2 ( u l o n g v a l u e ) ; 00174 00175 e x t e r n u i n t 3 2 m y _ r o u n d _ u p _ t o _ n e x t _ p o w e r ( u i n t 3 2 v ) ; 00176 00177 u i n t 3 2 m y _ c l e a r _ h i g h e s t _ b i t ( u i n t 3 2 v ) ; 00178 00179 u i n t 3 2 m y _ r e v e r s e _ b i t s ( u i n t 3 2 k e y ) ; 00180 00181 e x t e r n u i n t m y _ c o u n t _ b i t s ( u l o n g l o n g v ) ; 00182 00183 e x t e r n u i n t m y _ c o u n t _ b i t s _ u s h o r t ( u s h o r t v ) ; 00184 00185 # e n d i f / * H A V E _ I N L I N E * / 00186 00187 C _ M O D E _ E N D 00188 00189