Если гасить единички по одной (начиная с младшей), то и clz не нужен (это называется «Brian Kernighan's way»):
Код
uint_fast8_t cnt_1(uint32_t val)
{
uint_fast8_t cnt = 0;
while (val) {
++cnt;
val &= (val-1);
}
return cnt;
}
А вообще нужно запомнить слова
Bit twiddling hacks, они хорошо гуглятся. И там целый раздел на подсчёт единичек.