Класс bitset: получение и изменение значений

К любому элементу набора можно обратиться как к элементу массива. Достаточно указать его индекс в квадратных скобках. Нумерация начинается с нуля. Можно как получить значение, так и изменить его. Если индекс выходит за границы диапазона, то возвращаемое значение не определено. Прототипы «операторного» метода:

bool operator[](size_t pos) const;
reference operator[](size_t pos);

Возвращаемая оператором [] ссылка, описывается с помощью класса reference. Этот класс содержит следующие методы:

operator bool() const noexcept;
reference &operator=(bool x) noexcept;
reference &operator=(const reference &x) noexcept;
reference &flip() noexcept;
bool operator~() const noexcept;

Пример использования оператора []:

std::bitset<8> arr;
std::cout << arr[0] << std::endl; // 0
arr[0] = true;
std::cout << arr << std::endl;    // 00000001
arr[1] = arr[0];
std::cout << arr << std::endl;    // 00000011
arr[0].flip();
std::cout << arr << std::endl;    // 00000010
arr[0] = ~arr[2];
std::cout << arr << std::endl;    // 00000011

Для получения и изменения значений предназначены следующие методы:

  • set() — устанавливает или сбрасывает флаги. Если указанный индекс выходит за границы диапазона, то генерируется исключение. Прототипы метода:
bitset<N> &set(size_t pos, bool val=true);
bitset<N> &set() noexcept;

Первый прототип изменяет значение одного флага, расположенного по индексу pos, а второй — устанавливает все флаги:

std::bitset<8> arr1, arr2;
arr1.set(0, true);
std::cout << arr1 << std::endl; // 00000001
arr2.set();
std::cout << arr2 << std::endl; // 11111111
  • flip() — инвертирует значение одного или всех флагов. Если указанный индекс выходит за границы диапазона, то генерируется исключение. Прототипы метода:
bitset<N> &flip(size_t pos);
bitset<N> &flip() noexcept;

Первый прототип инвертирует значение одного флага, расположенного по индексу pos, а второй — инвертирует значения всех флагов:

std::bitset<8> arr1, arr2;
arr1.flip(0);
std::cout << arr1 << std::endl; // 00000001
arr2.flip();
std::cout << arr2 << std::endl; // 11111111
  • reset() — сбрасывает один или все флаги. Если указанный индекс выходит за границы диапазона, то генерируется исключение. Прототипы метода:
bitset<N> &reset(size_t pos);
bitset<N> &reset() noexcept;

Первый прототип сбрасывает один флаг, расположенный по индексу pos, а второй — сбрасывает все флаги:

std::bitset<8> arr1("11111111"), arr2("11111111");
arr1.reset(0);
std::cout << arr1 << std::endl; // 11111110
arr2.reset();
std::cout << arr2 << std::endl; // 00000000
  • test() — возвращает значение true, если флаг, расположенный по индексу pos, установлен, и false — в противном случае. Если индекс выходит за границы диапазона, то генерируется исключение. Прототип метода:
bool test(size_t pos) const;

Пример:

std::bitset<8> arr("01100101");
std::cout << arr.test(0) << std::endl; // 1
std::cout << arr.test(1) << std::endl; // 0
  • any() — возвращает значение true, если установлен хотя бы один флаг в наборе, и false — в противном случае. Прототип метода:
bool any() const noexcept;

Пример:

std::bitset<8> arr1("00000100"), arr2;
std::cout << arr1.any() << std::endl; // 1
std::cout << arr2.any() << std::endl; // 0
  • all() — возвращает значение true, если установлены все флаги, и false — в противном случае. Прототип метода:
bool all() const noexcept;

Пример:

std::bitset<8> arr1("11111111"), arr2("11111110");
std::cout << arr1.all() << std::endl; // 1
std::cout << arr2.all() << std::endl; // 0
  • none() — возвращает значение true, если ни один флаг в наборе не установлен, и false — в противном случае. Прототип метода:
bool none() const noexcept;

Пример:

std::bitset<8> arr1("11111111"), arr2;
std::cout << arr1.none() << std::endl; // 0
std::cout << arr2.none() << std::endl; // 1
  • count() — возвращает количество установленных флагов. Прототип метода:
size_t count() const noexcept;

Пример:

std::bitset<8> arr1("11010111"), arr2;
std::cout << arr1.count() << std::endl; // 6
std::cout << arr2.count() << std::endl; // 0
std::cout << arr1.size() << std::endl;  // 8
  • size() — возвращает общее количество флагов. Прототип метода:
constexpr size_t size() const noexcept;

Учебник C++ (MinGW-W64)
Учебник C++ (MinGW-W64) в формате PDF

Помощь сайту

ЮMoney (Yandex-деньги): 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов