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 нулевых битов. |
Комментарии
RareScrap
Ссылка на английский оригинал: http://www.cplusplus.com/reference/bitset/bitset/