Битовые множества
Битовое множество представляет собой контейнер, в котором могут храниться битовые последовательности фиксированной длины. Можно сказать, что оно служит представлением подмножеств фиксированного множества (в математическом смысле), каждому элементу которого соответствует один бит в определенной позиции. Единичный бит означает, что элемент принадлежит подмножеству, нулевой — что он не входит в данное подмножество. Подобным образом организованы множества языка Pascal.
Биты в bitset плотно упакованы, так что информация хранится очень экономно. Однако минимальный физический размер bitset равен 4 байтам — размеру int.
Создание битовых множеств
При создании битового множества указывается его размер (как аргумент шаблона). Можно инициализировать bitset строкой, состоящей из нулей и единиц:
bitset<32> bset1;
bitset<8> bset2(string ( "01011011"));
Вторая форма конструктора объявлена как explicit, с аргументом типа string, поэтому приходится делать явное преобразование литеральной строки в стандартную.
Действия над bitset
У класса bitset нет итераторов, и обращение к его элементам осуществляется по индексу.
Порядок следования элементов в bitset с точки зрения индексации является обратным расположению нулей и единиц в инициализирующей строке. (Это соответствует семантике двоичных чисел — слева стоит самый старший бит, которому обычно приписывают наибольший номер.)
Функция-элемент test() позволяет проверить состояние бита с указанным индексом. Функция апу() возвращает true, если хотя бы один из битов множества установлен.
Функции set () и reset () служат соответственно для установки и сброса битов множества. При указании индекса в качестве аргумента функция устанавливает/сбрасывает соответствующий бит; при вызове функции без аргумента устанавливаются/сбрасываются все биты множества.
Функция flip () инвертирует состояние указанного бита или всех битов множества.
К битовым множествам можно применять обычные логические поразрядные операции и сдвиги (~, &, |, ^, <<, >>).
Для битовых множеств определена операция передачи в поток (<<).
Вот небольшой пример, иллюстрирующий возможности битовых множеств:
#include <iostream>
#include <bitset>
#pragma hdrstop
#include <condefs.h>
using namespace std;
int main() {
bitset<8> bsetl, bset3;
bitset<8> bset2(string ("01011011"));
bsetl.set (0);
bsetl [7] = 1;
cout<< "First bitset : "<< 'bsetl<< endl;
cout << "Second bitset: " << bset2 << endl;
bsetl.flip();
cout<< "Flip first : " << bsetl << endl;
bset3 = bsetl ^ bset2;
cout << "First^second : " << bset3 << end1;
bset3 <<= 4;
cout << "Shifted by 4:" << bset3 << end1;
return 0;
}
Этот код выводит:
First bitset : 10000001
Second bitset: 01011011
Flip first : 01111110
First^second : 00100101
Shifted by 4 : 01010000