Некоторые из функций, count()
, size()
, all()
, any()
и none()
, не получают аргументов и возвращают информацию о состоянии всего набора битов. Другие, set()
, reset()
и flip()
, изменяют состояние набора битов. Функции-члены, изменяющие набор битов, допускают перегрузку. В любом случае версия функции без аргументов применяет соответствующую операцию ко всему набору, а версии функций, получающих позицию, применяют операцию к заданному биту:
bitset<32> bitvec(1U); //
bool is_set = bitvec.any(); //
bool is_not_set = bitvec.none(); //
bool all_set = bitvec.all(); //
size_t onBits = bitvec.count(); //
size_t sz = bitvec.size(); //
bitvec.flip(); //
bitvec.reset(); //
bitvec.set(); //
any()
возвращает значение true
, если один или несколько битов объекта класса bitset
установлены, т.е. равны 1. Функция none()
, наоборот, возвращает значение true
, если все биты содержат нуль. Новый стандарт ввел функцию all()
, возвращающую значение true
, если все биты установлены. Функции count()
и size()
возвращают значение типа size_t
(см. раздел 3.5.2), равное количеству установленных битов, или общее количество битов в объекте соответственно. Функция size()
— constexpr
, а значит, она применима там, где требуется константное выражение (см. раздел 2.4.4).
Функции flip()
, set()
, reset()
и test()
позволяют читать и записывать биты в заданную позицию:
bitvec.flip(0); //
bitvec.set(bitvec.size() - 1); // устанавливает последний бит
bitvec.set(0, 0); //
bitvec.reset(i); //
bitvec.test(0); //
Оператор индексирования перегружается как константный. Константная версия возвращает логическое значение true
, если бит по заданному индексу установлен, и значение false
в противном случае. Неконстантная версия возвращает специальный тип, определенный классом bitset
, позволяющий манипулировать битовым значением в позиции, заданной индексом:
bitvec[0] = 0; //
bitvec[31] = bitvec[0]; //
//
bitvec[0].flip(); //
~bitvec[0]; //
//
bool b = bitvec[0]; //
Функции to_ulong()
и to_ullong()
возвращают значение, содержащее ту же битовую схему, что и объект класса bitset
. Эти функции можно использовать, только если размер набора битов меньше или равен размеру типа unsigned long
для функции to_ulong()
и типа unsigned long long
для функции to_ullong()
соответственно:
unsigned long ulong = bitvec3.to_ulong();
cout << "ulong = " << ulong << endl;
overflow_error
(см. раздел 5.6).
bitset
Оператор ввода читает символы из входного потока во временный объект типа string
. Чтение продолжается, пока не будет заполнен соответствующий набор битов, или пока не встретится символ, отличный от 1 или 0, или не встретится конец файла, или ошибка ввода. Затем этой временной строкой (см. раздел 17.2.1) инициализируется набор битов. Если прочитано меньше символов, чем насчитывает набор битов, старшие биты, как обычно, устанавливаются в 0.