Ну не знаю на счет оптимизации...
Код:
function BitCount(B : Byte) : Byte;
const
cMask = 1;
begin
Result := 0;
While B <> 0 Do
Begin
Result := Result + (B And cMask);
B := B SHR 1;
End;
end;
Быстрее, разве только на асме переписать. Ну или совсем быстрый вариант - массив готовых значений и входной байт есть индекс. Извини, это писать просто лень (256 значений). Хотя можно сгенерить с использованием представленной функции.