Таблица 4.4. Операции с классом 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.flip(4) |
set() |
Выставить все биты в 1 |
a.set() |
set(pos) |
Выставить бит pos в 1 |
a.set(4) |
reset() |
Выставить все биты в 0 |
a.reset() |
reset(pos) |
Выставить бит pos в 0 |
a.reset(4) |
Как мы уже говорили, необходимость создавать сложные выражения для манипуляции битовыми векторами затрудняет использование встроенных типов данных. Класс bitset упрощает работу с битовым вектором. Вот какое выражение нам приходилось писать в предыдущем разделе для того, чтобы “взвести” 27-й бит:
quiz1 |= 1<<27;
При использовании bitset то же самое мы можем сделать двумя способами:
quiz1[27] = 1;
или
quiz1.set(27);
(В нашем примере мы не используем нулевой бит, чтобы сохранить “естественную” нумерацию. На самом деле, нумерация битов начинается с 0.)
Для использования класса bitset необходимо включить заголовочный файл:
#include <bitset>
Объект типа bitset может быть объявлен тремя способами. В определении по умолчанию мы просто указываем размер битового вектора:
bitset<32> bitvec;
Это определение задает объект bitset, содержащий 32 бита с номерами от 0 до 31. Все биты инициализируются нулем. С помощью функции any() можно проверить, есть ли в векторе единичные биты. Эта функция возвращает true, если хотя бы один бит отличен от нуля. Например:
bool is_set = bitvec.any();
Переменная is_set получит значение false, так как объект bitset по умолчанию инициализируется нулями. Парная функция none() возвращает true, если все биты равны нулю:
bool is_not_set = bitvec.none();