Подсчет количества единичных битов до указанного индекса

Доброго времени суток.

Задача: Имеется класс реализующий битовый вектор. В этом классе необходимо добавить метод подсчитывающий кол-во бит установленных в 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;
    }

}

Вопрос: собственно это было тестовое задание. Я показал реализацию этого метода и мне сказали что я выбрал крайне не оптимальное решение. Сперва я подозревал, что я не правильно понял задание (точный текст задания представлен в начале этого вопроса). Потом я долго и безуспешно ломал голову, пытаясь найти лучшее решение. Помогите пожалуйста понять - в чем заключается недостаток моего решения? Какое решение подошло бы лучше?


Ответы (0 шт):