Подсчёт числа установленных битов в файле

    Одна интересная реализация подсчёта числа установленных битов в файле. Код на языке C++ с обильным использованием STL. Если всё так хорошо, то почему это в блоге «Ненормальное программирование» (читатели настоятельно рекомендовали перенести в блог C++) спросите Вы? Сейчас увидите :)



    Во-первых объявим класс битового итератора:



    Теперь подсчитаем число установленных бит в исполняемом файле:



    Забавно, неправда ли? А чтобы подсчитать число нулевых бит, всего лишь нужно вызвать:



    Вместо:



    Исходный код выложен здесь: codepad.org/S1TT56PR (см. ссылку в UPDATE2).

    UPDATE1:
    Товарищ gribozavr справедливо заметил, что правильней использовать константу CHAR_BIT вместо числа 8 в коде.

    UPDATE2:
    Товарищ mark_ablov указал на изъян в конструкторе копирования, код в статье обновлён и вот исправленная версия кода: http://codepad.org/knEKdNJX.

    Похожие публикации

    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

    Комментарии 20

      +31
      >> то почему это в блоге «Ненормальное программирование» спросите Вы?

      Может потому, что при наличии тэга code, код выложен скриншотами?
        –6
        И это тоже)) Но скриншоты мне нравятся тем, что на них форматирование именно такое, какое я задумал. И никакие браузеры/посвечивалки синтаксиса и прочие инструменты мне ничего не испортят. Ссылка на код имеется в конце статьи.
          +4
          Я Вас разочарую, но в браузере Android ваши картинки смотрятся как говно.
          0
          > при наличии тэга code…

          Лучше тег source, чтобы была подсветка кода.
          +3
          Так что ненормального? Наличие битового итератора?
            –2
            Код демонстрирует интересный прием использования стандартной библиотеки. В какой блог Вы предложите отнести этот код?
              +3
              В блог «C++»? По-моему, лучше не придумаешь.
                0
                Перенёс
            +2
            Красиво, но, к сожалению, не эффективно. (А вот lookup table или команда popcnt...)

            В коде вместо 8 надо бы константу CHAR_BIT использовать.
              0
              >> Красиво, но, к сожалению, не эффективно.
              Потому и «ненормально»))

              >> В коде вместо 8 надо бы константу CHAR_BIT использовать.
              Согласен, допишу к статье.

              >> команда popcnt
              Жаль она только в SSE4 появилась, мой Quad не тянет((

              >> lookup table
              Хотел бы дополнить ваш ответ ссылкой на описание нескольких весьма эффективных методов подсчёта числа установленных битов: http://graphics.stanford.edu/~seander/bithacks.html#CountBitsSetNaive
              +1
              а зачем вам нужно чтоб конструктор копирования обнулял позицию?
                –1
                чтобы он устанавливался на нулевой бит в байте
                  +2
                  а зачем это делать в конструкторе копирования?
                    0
                    Исправил ошибку, спасибо за feedback)
                      0
                      теперь пропал смысл в этом конструкторе, ибо дефолтный (если не реализуете свой) делает всё то же самое.
                      кроме того, обычно конструктор копирования идёт в паре с оператором присваивания, иначе получаем неполноценную реализацию класса, если добавим только один из «методов».
                        0
                        Согласен без КК можно обойтись. Оператор присваивания делает тоже самоеЮ так что его тоже можно не писать…
                +2
                Зашёл в топик, только из-за того, что надеялся увидеть результат суммирования волны и ложки. Зашёл, и обломался.
                  0
                  нет стоит из operator* возвращать ссылку на int, если через него нельзя установить текущий бит.
                    0
                    Спасибо. Правда я уже понял что слажал.
                    Сейчас готовлю еще одну статью про итераторы.
                    Эта статья нашла «большой положительный» отклик)) решил продолжить)
                    0
                    да, кавычки тут в к месту поставили))

                    Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                    Самое читаемое