Самый быстрый способ, которым я когда-либо видел заполнение такого массива, это ...
array[0] = 0;
for (i = 1; i < NELEMENTS; i++) {
array[i] = array[i >> 1] + (i & 1);
}
Затем подсчитать количество установленных бит в данном числе (при условии, что данное число меньше, чем NELEMENTS)...
numSetBits = array[givenNumber];
Если ваша память не ограничена, я часто вижу NELEMENTS, установленный на 256 (для одного байта), и добавляю количество битов в каждом байте в ваше целое число.