Puoi utilizzare una maschera e un AND.
Utilizzi una variabile
unsigned char mask = 0x01
che ha un unico bit, quello più a destra, a 1. Eseguendo un AND tra la tua stringa di byte
unsigned char byte = ...
e la maschera, verifichi se il bit più a destra è uguale a 1: in tal caso, incrementi un contatore.
Fatto ciò, esegui uno shift a sinistra di mask:
mask = mask << 1
spostando in tal modo a sinistra la posizione del bit da verificare. Ripeti il tutto finché avrai analizzato tutti bit della stringa.
Una cosa del genere:
unsigned char byte = ...;
unsigned char mask = 0x01;
int count = 0;
do{
if((byte & mask) != 0)
count++;
mask = mask << 1;
}while(mask != 0x00);