Подсчет количества единичных битов до указанного индекса
Доброго времени суток.
Задача: Имеется класс реализующий битовый вектор. В этом классе необходимо добавить метод подсчитывающий кол-во бит установленных в 1 начиная от бита с индексом 0 и заканчивая битом с индексом toIndex, исключая его. Реализацию других методов в классе менять нельзя.
Как я пытался решить задачу:
Вот что у меня получилось -
public final class Bits {
private long[] words = {0L};
private int size; //Выполняет ту же функцию, что и поле length у массивов.
//другие методы этого класса...
public int cardinality(int toIndex) {
if(toIndex < 0 || toIndex > size)
throw new IndexOutOfBoundsException(
"Должно выполняться условие toIndex >= 0 && toIndex <= size. toIndex = " + toIndex);
int countBits = 0;
int numberWords = toIndex >>> 6; //кол-во слов до слова содержащего бит с индексом toIndex.
for(int i = 0; i < numberWords; ++i) countBits += Long.bitCount(words[i]);
long word = words[numberWords] & ~(1L << toIndex); //исключаем toIndex из последнего слова
countBits += Long.bitCount(word & -1L >>> (64 - toIndex));
return countBits;
}
}
Вопрос: собственно это было тестовое задание. Я показал реализацию этого метода и мне сказали что я выбрал крайне не оптимальное решение. Сперва я подозревал, что я не правильно понял задание (точный текст задания представлен в начале этого вопроса). Потом я долго и безуспешно ломал голову, пытаясь найти лучшее решение. Помогите пожалуйста понять - в чем заключается недостаток моего решения? Какое решение подошло бы лучше?