kuvshinovdr / OGxx

Object-oriented graph algorithm library in C++ developed for educational purposes.
MIT License
1 stars 1 forks source link

Dense_bit_iterator #5

Closed kuvshinovdr closed 11 months ago

kuvshinovdr commented 1 year ago

Создать файл source/dense_bit_iterator.cpp (в заголовке ошибся: сначала dense, потом bit). В нём разместить класс ogxx::Dense_bit_iterator: public ogxx::Basic_iterator<bool>. Данный итератор должен перечислять биты последовательности бит, заданной массивом значений unsigned. Позиция бита задаётся unsigned const* word и int bit, т.е. указателем на "слово" и номером бита в "слове". Всего хранится две позиции бит: текущая и конечная.

Реализовать метод next.

Перед началом работы не забудьте обновить свою ветку по ветке main.

kuvshinovdr commented 1 year ago

Класс Dense_bit_iterator требуется для реализации других задач, желательно поскорее его получить.

kuvshinovdr commented 1 year ago

Добавить поле stride (шаг между битами). По умолчанию 1. Это позволит ходить по столбцам и диагоналям бит-матрицы.

tsay-a-vensky commented 1 year ago

Загрузил файл, это то, что я был должен сделать или нужно что-то добавить?

kuvshinovdr commented 1 year ago
  1. Файл переименовать dense_bit_iterator.cpp, commit & push.
  2. Заменить
    #include "matrix.hpp"

    на

    #include <ogxx/iterator.hpp>
  3. Все int заменить на size_t.
  4. currentbit должен увеличиваться на stride, а не на 1.
  5. Метод next должен соответствовать интерфейсу:
    bool next(bool & value) noexcept override

    Возвращать истину, если итератор ещё не дошёл до конца, ложь -- если дошёл. Если не дошёл до конца -- извлекать бит и записывать его значение в value.

tsay-a-vensky commented 1 year ago

Правильно ли я обращаюсь ко значению value? вроде раз word = массив, то по позиции currentbit я же получаю значение бита?

kuvshinovdr commented 1 year ago

Нет.

word[currentbit]

обращается к значению типа unsigned в массиве, на который указывает word. Нам же нужно извлечь один бит. Если unsigned имеет ширину word_bits (обычно это 32), то извлечь бит можно так:

(word[currentbit / word_bits] >> (currentbit % word_bits)) & 1

Определить константу word_bits можно так:

constexpr unsigned word_bits = sizeof(unsigned) * CHAR_BIT;
kuvshinovdr commented 1 year ago

Изначально было правильно: >>. На паре я поменял на неправильный вариант!

kuvshinovdr commented 11 months ago

Задание выполнено, код добавлен в main.