bitset: класс — контейнер для хранения битов

bitset — это специальный класс-контейнер, который предназначен для хранения битовых значений (элементы этого контейнера могут иметь значения: 0 и/или 1, истина или ложь).

Класс bitset очень похож на обычный массив, но, в отличии от массива, под каждый элемент объекта типа bitset отводится всего один бит, то есть пространство в памяти, которое занимают битовые маски максимально оптимизировано. Что позволяет использовать память в восемь раз меньше, чем наименьший элементарный тип данных в C++ — char).

Каждый элемент (каждый бит) может быть доступен по отдельности: например, у нас есть объект типа bitset c именем mybitset, необходимо получить доступ к четвертому биту. Для этого, после имени массива, в квадратных скобочках укажем индекс бита, как если бы мы хотели получить доступ к элементу массива — mybitset[3].

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

class bitset::reference {
  friend class bitset;
  reference();                                 // закрытый конструктор
public:
  ~reference();
  operator bool () const;                      // преобразовать к типу bool
  reference& operator= ( bool x );             // присвоить значение типа bool
  reference& operator= ( const reference& x ); // присвоить битовое значение
  reference& flip();                           // flip bit value
  bool operator~() const;                      // инвертировать значение
}

Кроме перегрузки нескольких операторов и обеспечения прямого доступа к битам, объект bitsets может быть преобразован в целочисленное беззнаковое значение и — в двоичную строку (подробно — см. конструктор, bitset:: to_ulong и bitset::to_string). Битовые сетки также могут напрямую вставляется и извлекается из потока в двоичном формате.

Битовые маски имеют фиксированный размер. В С++ есть подобный контейнер, который также оптимизирует выделяемое пространство и, при этом, позволяет динамически изменять размер массива, смотреть статью про контейнер vector (vector <bool> — битовая маска посредством класса-контейнера vector).

В настоящей реализации класса-контейнера Стандартной библиотеки шаблонов C++, объект типа bitset принимает один параметр шаблона:

template < size_t N > class bitset;

где, параметр шаблона имеет следующее значение:

  • N — количество битов, которое содержит битовая маска (size_t — целочисленный тип данных).

size_t — псевдоним одного из беззнаковых целочисленных типов данных в С++.

Этот тип данных может представить размер любого объекта в байтах. size_t возвращается оператором sizeof и широко используется в стандартной библиотеке для представления размеров и для подсчета.

Функции-члены класса-контейнера bitsets стандартной библиотеки шаблонов С++
 constructor  Конструктор класса bitset.
используемые операторы Перегруженные операторы для выполнения побитовых логических операций и организации ввода/вывода объектов bitset.
Доступ к битам
 operator[] Перегруженный оператор квадратных скобок, для организации непосредственного  доступа к битам.
  Битовые операции
set Функция позволяет инициализировать все биты единицами или изменить значение отдельного бита.
reset Обнуление указанных битов (сброс битов в 0).
 flip Преобразовать битовую маску в обратный код. То есть 1-цы заменить нулями, а 0 — единицами.
 Операции с битовыми масками
to_ulong Преобразовать битовый объект в целое длинное беззнаковое значение.
to_string Преобразовать битовую последовательность в строку типа string, которая будет содержать символы 0 и/или 1.
count Возвращает количество единичных битов объекта bitset.
size Вернуть размер объекта bitset (количество битов).
test Возвращает значение указанного бита объекта bitset.
any Проверяет битовое значение на предмет наличия в объекте bitset единичных битов.
none Проверяет битовое значение на предмет наличия в объекте bitset нулевых битов.
Автор: Marienko L.
Дата: 04.02.2013
Поделиться:

Комментарии

  1. RareScrap

    RareScrap

    Ссылка на английский оригинал: http://www.cplusplus.com/reference/bitset/bitset/

Оставить комментарий

Вы должны войти, чтобы оставить комментарий.