Ivo Bloechliger wrote:
> 
>>On Thu, Aug 29, 2002 at 06:34:28PM +0200, Francois Ryser wrote:
>>
>>>Bonjours,
>>>
>>>Je recherche une methode en c++ de compter le nombre de bits a 1 dans des
>>>mots de 16 bits, mais avec un imperatif de vitesse car nous devons faire sur
>>>1 million de mots de 16 bits
>>>
> Je pense que l'utilisation d'op�rations sur bits devrait �tre plus 
> rapide du style (pour l'int�rieur de la boucle).
> 
>    r += w & 1;  // bit-wise logical AND
>    w >>=1;       // bit-shift

unsigned int while_cnt (unsigned int mot)
{
   unsigned int res = 0;
   while (mot != 0) {
     res += mot & 1;
     mot >>= 1;
   }
   return res;
}

Ou bien le plus simple, avec la biblioth�que standard :

unsigned int std_cnt (unsigned short mot)
{
   return std::bitset<16>(mot).count();
}


> Sinon faire un tableau � 65536 (=2^16) entr�es et stocker les r�sultat 
> peut valoir la peine dans ton cas �galement.

unsigned int tab_cnt2 (unsigned short mot)
{
   return lookup16[mot];
}

Ou bien avec un tableau de 256 entr�es utilis� 2 fois.

unsigned int tab_cnt (unsigned short mot)
{
   return lookup8[mot & 0xFF] + lookup8[mot >> 8];
}

> Mais bon il y a encore mieux :-(  
> http://www.devx.com/free/tips/tipview.asp?content_id=3839

Certainement la plus rapide pour des mots de 32 bits.
On pourrait sans doute l'optimiser pour du 16 bits
car j'obtiens de meilleures r�sultat avec double lookup
(sans doute meilleur que lookup2 car utilisant mieux la
cache de donn�es).

Temps relatifs sur mon PC (K6)
0.162030 s par tab_cnt
0.200805 s par count_bits
0.239354 s par tab_cnt2
0.343694 s par std_cnt
0.445795 s par while_cnt


Marc Mongenet

--
http://www-internal.alphanet.ch/linux-leman/ avant de poser
une question. Ouais, pour se d�sabonner aussi.

Répondre à