[ NrmMyth @ 14.08.2005. 17:15 ] @
Pozdrav.
Evo pitanja za najjace optimizatore i iskusne programere.

Radi se o funkciji za prebrojavanje ukljucenih bitova u nekoj varijabli.
Pogledajte oba primjera pa recite koji je brzi.

Code:
template<class T>
unsigned count(T var)  {
     unsigned rezultat(0); // broj ukljucenih bitova
     unsigned br_bitova(sizeof(T)*8); // broj ukupnih bitova u varijabli
// pogledajte ovaj dio 
     for(int i(0); i<br_bitova; ++i)  {
            rezultat+=static_cast<unsigned>( static_cast<bool>(var & maska[i]) );
     return rezultat;
}

//// i druga funkcija

template<class T>
unsigned count(T var)  {
     unsigned rezultat(0); // broj ukljucenih bitova
     unsigned br_bitova(sizeof(T)*8); // broj ukupnih bitova u varijabli
// pogledajte ovaj dio 
     for(int i(0); i<br_bitova; ++i)  {
            if( (var & maska[i]) != 0)
                  ++rezultat;
     return rezultat;
}

NB: maska[] je niz integera sa postavljenim samo jednim bitom, { 1,2,8,16,32,64, ... }


Razlika je u tome sta u prvoj funkciji on pretvara broj u 0 ili 1, pa ga sprema kao integer i zbraja na sumu,
a u drugoj on provjerava jeli razlicito od nule i tek onda ako je incrementira.

Znam da je ovo fanaticna situacija, ali brzina mi je bitna, jer se u mom slucaju ne radi o jednoj varijabli.

Pitanje je jeli brzi if() od 2 static_casta<>() i bespotrebnog dodavanja 0.
[ NastyBoy @ 14.08.2005. 17:27 ] @
Ako vec jurish optimizaciju, pogledaj sledeci nachin pre nego se upustish u optimizaciju nechega shto nije optimalno u startu (mislim na duzhinu petlje).

Code:

int bit_count(long x)
{
        int n = 0;

        if (x)
            do {
               n++;
            } while ((x &= x-1));

        return(n);
}


Pogledaj slichne primere na : http://paul.rutgers.edu/~rhoads/Code/code.html
[ caboom @ 14.08.2005. 21:58 ] @
http://www-db.stanford.edu/~manku/bitcount/bitcount.html

NrmMyth, gornja dva primera koje si naveo su sve samo ne efikasni...
[ NrmMyth @ 15.08.2005. 10:33 ] @
Zahvaljujem na teoriji.