pocet jednotiek v slove - algoritmus

Radek Benedikt benedikt na login.cz
Neděle Září 19 21:21:11 CEST 2010


Dne neděle 19 září 2010 20:20 Jan Waclawek napsal(a):
> Inak toto je typicka uloha ktora sa riesi pomerne trivialne sekvencnou
> logikou (posuvny register a pocitadlo) a uplne netrivialne kombinacnou.
Nevim jak kombinacni logikou, ale zaujalo me to a nasel jsem docela slusny 
rozbor teto ulohy 
http://gurmeetsingh.wordpress.com/2008/08/05/fast-bit-counting-routines/ a 
nektere algoritmy jsou opravdu silene.

5) Nifty Parallel Count
#define MASK_01010101 (((unsigned int)(-1))/3)
#define MASK_00110011 (((unsigned int)(-1))/5)
#define MASK_00001111 (((unsigned int)(-1))/17)
 int bitcount (unsigned int n) {
   n = (n & MASK_01010101) + ((n >> 1) & MASK_01010101) ;
   n = (n & MASK_00110011) + ((n >> 2) & MASK_00110011) ;
   n = (n & MASK_00001111) + ((n >> 4) & MASK_00001111) ;
   return n % 255 ;
}

tenhle jeste jde ale nasleduji (neni nad The Art of Computer Programming od 
Knuth-a)

6) MIT HAKMEM Count
int bitcount(unsigned int n) {
   /* works for 32-bit numbers only    */
   /* fix last line for 64-bit numbers */

   register unsigned int tmp;

   tmp = n - ((n >> 1) & 033333333333)
           - ((n >> 2) & 011111111111);
   return ((tmp + (tmp >> 3)) & 030707070707) % 63;
}

Radek


Další informace o konferenci Hw-list