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, ... }
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.