[ 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. |