Класс bitset

Класс bitset упрощает работу с битовым вектором.

Операция Значение Использование
test(pos) Бит pos равен 1? a.test(4)
any() Хотя бы один бит равен 1? a.any()
none() Ни один бит не равен 1? a.none()
count() Количество битов, равных 1 a.count()
size() Общее количество битов a.size()
[pos] Доступ к биту pos a[4]
flip() Изменить значения всех a.flip()
flip(pos) Изменить значение бита pos a.fli p(4)
set() Выставить все биты в 1 a.set()
set(pos) Выставить бит pos в 1 a.se t(4)
reset() Выставить все биты в 0 a.reset()
reset(pos) Выставить бит pos в 0 a.rese t(4)

Как мы уже говорили, необходимость создавать сложные выражения для манипуляции битовыми векторами затрудняет использование встроенных типов данных. Класс bitset упрощает работу с битовым вектором. Вот какое выражение нам приходилось писать в предыдущем разделе для того, чтобы “взвести” 27-й бит:

При использовании bitset то же самое мы можем сделать двумя способами:

или

(В нашем примере мы не используем нулевой бит, чтобы сохранить “естественную” нумерацию. На самом деле, нумерация битов начинается с 0.)
Для использования класса bitset необходимо включить заголовочный файл:

Объект типа bitset может быть объявлен тремя способами. В определении по умолчанию мы просто указываем размер битового вектора:

Это определение задает объект bitset, содержащий 32 бита с номерами от 0 до 31. Все биты инициализируются нулем. С помощью функции any() можно проверить, есть ли в векторе единичные биты. Эта функция возвращает true, если хотя бы один бит отличен от нуля.

Например:

Переменная is_set получит значение false, так как объект bitset по умолчанию инициализируется нулями. Парная функция none() возвращает true, если все биты равны нулю:

Изменить значение отдельного бита можно двумя способами: воспользовавшись функциями set() и reset() или индексом. Так, следующий цикл выставляет в 1 каждый четный бит:

Аналогично существует два способа проверки значений каждого бита – с помощью функции test() и с помощью индекса. Функция test() возвращает true, если соответствующий бит равен 1, и false в противном случае. Например:

Значения битов с помощью индекса проверяются таким образом:

Следующая пара операторов демонстрирует сброс первого бита двумя способами:

Функции set() и reset() могут применяться ко всему битовому вектору в целом. В этом случае они должны быть вызваны без параметра.

Например:

Функция flip() меняет значение отдельного бита или всего битового вектора:

Существуют еще два способа определить объект типа bitset. Оба они дают возможность проинициализировать объект определенным набором нулей и единиц. Первый способ – явно задать целое беззнаковое число как аргумент конструктору. Начальные N позиций битового вектора получат значения соответствующих двоичных разрядов аргумента.

Например:

инициализирует bitvec2 следующим набором значений:

В результате определения:

у bitvec3 окажутся ненулевыми биты на местах 1 и 3:

В качестве аргумента конструктору может быть передано и строковое значение, состоящее из нулей и единиц. Например, следующее определение инициализирует bitvec4 тем же набором значений, что и bitvec3:

Можно также указать диапазон символов строки, выступающих как начальные значения для битового вектора.

Например:

Мы получаем то же значение, что и для bitvec3 и bitvec4. Если опустить третий параметр, подстрока берется до конца исходной строки:

Класс bitset предоставляет две функции-члена для преобразования объекта bitset в другой тип. Для трансформации в строку, состоящую из символов нулей и единиц, служит функция to_string():

Вторая функция, to_long(), преобразует битовый вектор в его целочисленное представление в виде unsigned long, если, конечно, оно помещается в unsigned long. Это видоизменение особенно полезно, если мы хотим передать битовый вектор функции на С или С++, не пользующейся стандартной библиотекой.
К объектам типа bitset можно применять побитовые операции.

Например:

Объект bitvec7 инициализируется результатом побитового И двух битовых векторов bitvec2 и bitvec3.

Здесь bitvec8 инициализируется результатом побитового ИЛИ векторов bitvec2 и bitvec3. Точно так же поддерживаются и составные операции присваивания и сдвига.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

3 × 1 =