C++ Программирование в среде С++ Builder 5

         

Битовые множества


Битовое множество представляет собой контейнер, в котором могут храниться битовые последовательности фиксированной длины. Можно сказать, что оно служит представлением подмножеств фиксированного множества (в математическом смысле), каждому элементу которого соответствует один бит в определенной позиции. Единичный бит означает, что элемент принадлежит подмножеству, нулевой — что он не входит в данное подмножество. Подобным образом организованы множества языка 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


Содержание раздела