23 General utilities library [utilities]

23.9 Bitsets [bitset]

23.9.2 Class template bitset [template.bitset]

namespace std {
  template<size_t N> class bitset {
  public:
    // bit reference:
    class reference {
      friend class bitset;
      reference() noexcept;
    public:
      ~reference() noexcept;
      reference& operator=(bool x) noexcept;             // for b[i] = x;
      reference& operator=(const reference&) noexcept;   // for b[i] = b[j];
      bool operator~() const noexcept;                   // flips the bit
      operator bool() const noexcept;                    // for x = b[i];
      reference& flip() noexcept;                        // for b[i].flip();
    };

    // [bitset.cons], constructors
    constexpr bitset() noexcept;
    constexpr bitset(unsigned long long val) noexcept;
    template<class charT, class traits, class Allocator>
      explicit bitset(
        const basic_string<charT, traits, Allocator>& str,
        typename basic_string<charT, traits, Allocator>::size_type pos = 0,
        typename basic_string<charT, traits, Allocator>::size_type n =
          basic_string<charT, traits, Allocator>::npos,
        charT zero = charT('0'),
        charT one = charT('1'));
    template <class charT>
      explicit bitset(
        const charT* str,
        typename basic_string<charT>::size_type n = basic_string<charT>::npos,
        charT zero = charT('0'),
        charT one = charT('1'));

    // [bitset.members], bitset operations
    bitset<N>& operator&=(const bitset<N>& rhs) noexcept;
    bitset<N>& operator|=(const bitset<N>& rhs) noexcept;
    bitset<N>& operator^=(const bitset<N>& rhs) noexcept;
    bitset<N>& operator<<=(size_t pos) noexcept;
    bitset<N>& operator>>=(size_t pos) noexcept;
    bitset<N>& set() noexcept;
    bitset<N>& set(size_t pos, bool val = true);
    bitset<N>& reset() noexcept;
    bitset<N>& reset(size_t pos);
    bitset<N>  operator~() const noexcept;
    bitset<N>& flip() noexcept;
    bitset<N>& flip(size_t pos);

    // element access:
    constexpr bool operator[](size_t pos) const;       // for b[i];
    reference operator[](size_t pos);                  // for b[i];

    unsigned long to_ulong() const;
    unsigned long long to_ullong() const;
    template <class charT = char,
              class traits = char_traits<charT>,
              class Allocator = allocator<charT>>
      basic_string<charT, traits, Allocator>
        to_string(charT zero = charT('0'), charT one = charT('1')) const;

    size_t count() const noexcept;
    constexpr size_t size() const noexcept;
    bool operator==(const bitset<N>& rhs) const noexcept;
    bool operator!=(const bitset<N>& rhs) const noexcept;
    bool test(size_t pos) const;
    bool all() const noexcept;
    bool any() const noexcept;
    bool none() const noexcept;
    bitset<N> operator<<(size_t pos) const noexcept;
    bitset<N> operator>>(size_t pos) const noexcept;
  };

  // [bitset.hash], hash support
  template <class T> struct hash;
  template <size_t N> struct hash<bitset<N>>;
}

Шаблон класса bitset<N>описывает объект , который может хранить последовательность , состоящую из фиксированного числа бит,N.

Каждый бит представляет либо нулевое значение (сброс), либо единицу (набор). Для того, чтобы toggle немного, чтобы изменить нулевое значение на один или значение единицы до нуля. Каждый бит имеет неотрицательную позициюpos. При преобразовании между объектом класса bitset<N> и значением некоторого целочисленного типа позиция битаpos соответствует bit value 1 << pos. Целое значение, соответствующее двум или более битам, является суммой их битовых значений.

Функции, описанные в этом подпункте, могут сообщать о трех типах ошибок, каждая из которых связана с отдельным исключением:

23.9.2.1 bitset constructors [bitset.cons]

constexpr bitset() noexcept;

Effects: Создает объект класса bitset<N>, инициализируя все биты нулями.

constexpr bitset(unsigned long long val) noexcept;

Effects: Создает объект класса bitset<N>, инициализируя первыеM битовые позиции соответствующими битовыми значениями вval. M является меньшим изN и число битов в value representation оunsigned long long. ЕслиM < N, оставшиеся битовые позиции инициализируются нулем.

template <class charT, class traits, class Allocator> explicit bitset(const basic_string<charT, traits, Allocator>& str, typename basic_string<charT, traits, Allocator>::size_type pos = 0, typename basic_string<charT, traits, Allocator>::size_type n = basic_string<charT, traits, Allocator>::npos, charT zero = charT('0'), charT one = charT('1'));

Throws: out_­of_­range если pos > str.size() илиinvalid_­argument если обнаружен недопустимый символ (см. ниже).

Effects: Определяет эффективную длину rlen инициализирующей строки как меньшее из значений n и str.size() - pos.

Затем функция выдает, invalid_­argument если какой-либо изrlen символов вstr начале позицииpos отличается отzero илиone. Функция используетсяtraits​::​eq() для сравнения значений символов.

В противном случае функция создает объект класса bitset<N>, инициализируя первыеM битовые позиции значениями, определенными из соответствующих символов в строке str. M является меньшим изN иrlen.

Элемент построенного объекта имеет нулевое значение, если соответствующий символ вstr, начиная с позиции pos, имеет значение zero. В противном случае элемент имеет значение один. Позиция символаpos + M - 1 соответствует нулевой позиции бита. Последующие уменьшающиеся позиции символов соответствуют увеличивающимся позициям битов.

ЕслиM < N, оставшиеся битовые позиции инициализируются нулем.

template <class charT> explicit bitset( const charT* str, typename basic_string<charT>::size_type n = basic_string<charT>::npos, charT zero = charT('0'), charT one = charT('1'));

Effects: Создает объект класса,bitset<N> как если бы:

bitset(
  n == basic_string<charT>::npos
    ? basic_string<charT>(str)
    : basic_string<charT>(str, n),
  0, n, zero, one)

23.9.2.2 bitset members [bitset.members]

bitset<N>& operator&=(const bitset<N>& rhs) noexcept;

Effects: Очищает каждый бит, *this для которогоrhs очищен соответствующий бит , и оставляет все остальные биты без изменений.

Returns: *this.

bitset<N>& operator|=(const bitset<N>& rhs) noexcept;

Effects: Устанавливает каждый бит, *this для которого установлен соответствующий битrhs , и оставляет все остальные биты неизменными.

Returns: *this.

bitset<N>& operator^=(const bitset<N>& rhs) noexcept;

Effects: Включает каждый бит, *this для которого установлен соответствующий битrhs , и оставляет все остальные биты неизменными.

Returns: *this.

bitset<N>& operator<<=(size_t pos) noexcept;

Effects: Заменяет каждый бит в положении ,I в *this с величиной , определенной следующим образом :

  • ЕслиI < posновое значение равно нулю;

  • ЕслиI >= posновое значение - это предыдущее значение бита в позицииI - pos.

Returns: *this.

bitset<N>& operator>>=(size_t pos) noexcept;

Effects: Заменяет каждый бит в положении ,I в *this с величиной , определенной следующим образом :

  • Еслиpos >= N - Iновое значение равно нулю;

  • Еслиpos < N - Iновое значение - это предыдущее значение бита в позицииI + pos.

Returns: *this.

bitset<N>& set() noexcept;

Effects: Устанавливает все биты *this.

Returns: *this.

bitset<N>& set(size_t pos, bool val = true);

Throws: out_­of_­range еслиpos не соответствует действительной битовой позиции.

Effects: Сохраняет новое значение в бите в положенииpos в *this. Еслиval не ноль, сохраненное значение равно единице, в противном случае - нулю.

Returns: *this.

bitset<N>& reset() noexcept;

Effects: Сбрасывает все биты *this.

Returns: *this.

bitset<N>& reset(size_t pos);

Throws: out_­of_­range еслиpos не соответствует действительной битовой позиции.

Effects: Сброс бита в позицииpos в *this.

Returns: *this.

bitset<N> operator~() const noexcept;

Effects: Создает объектx класса bitset<N> и инициализирует его с помощью *this.

Returns: x.flip().

bitset<N>& flip() noexcept;

Effects: Включает все биты *this.

Returns: *this.

bitset<N>& flip(size_t pos);

Throws: out_­of_­range еслиpos не соответствует действительной битовой позиции.

Effects: Переключает бит в позицииpos в *this.

Returns: *this.

unsigned long to_ulong() const;

Throws: overflow_­error если целочисленное значение,x соответствующее битам в, *this не может быть представлено как тип unsigned long.

Returns: x.

unsigned long long to_ullong() const;

Throws: overflow_­error если целочисленное значение,x соответствующее битам в, *this не может быть представлено как тип unsigned long long.

Returns: x.

template <class charT = char, class traits = char_traits<charT>, class Allocator = allocator<charT>> basic_string<charT, traits, Allocator> to_string(charT zero = charT('0'), charT one = charT('1')) const;

Effects: Создает строковый объект соответствующего типа и инициализирует его строкой из длинныхN символов. Каждый символ определяется значением соответствующей ему битовой позиции в *this. Позиция символаN - 1 соответствует нулевой позиции бита. Последующие уменьшающиеся позиции символов соответствуют увеличивающимся позициям битов. Нулевоеzeroбитовое значение становится символом , битовое значение 1 становится символом one.

Returns: Созданный объект.

size_t count() const noexcept;

Returns: Подсчет количества установленных битов *this.

constexpr size_t size() const noexcept;

Returns: N.

bool operator==(const bitset<N>& rhs) const noexcept;

Returns: true если значение каждого бита в *this равно значению соответствующего бита вrhs.

bool operator!=(const bitset<N>& rhs) const noexcept;

Returns: true если !(*this == rhs).

bool test(size_t pos) const;

Throws: out_­of_­range еслиpos не соответствует действительной битовой позиции.

Returns: true если бит в позицииpos in *this имеет значение один.

bool all() const noexcept;

Returns:count() == size().

bool any() const noexcept;

Returns:count() != 0.

bool none() const noexcept;

Returns:count() == 0.

bitset<N> operator<<(size_t pos) const noexcept;

Returns: bitset<N>(*this) <<= pos.

bitset<N> operator>>(size_t pos) const noexcept;

Returns: bitset<N>(*this) >>= pos.

constexpr bool operator[](size_t pos) const;

Requires: pos действительны.

Returns: true если бит в позицииpos in*this имеет значение один, иначеfalse.

Throws: Ничего такого.

bitset<N>::reference operator[](size_t pos);

Requires: pos действительны.

Returns: Объект типа bitset<N>​::​reference таким образом, что (*this)[pos] == this->test(pos), и такое , что (*this)[pos] = val эквивалентно this->set(pos, val).

Throws: Ничего такого.

Remarks: С целью определения наличия a data raceлюбой доступ или обновление через результирующую ссылку потенциально обращается или модифицирует, соответственно, весь базовый битовый набор.