The header
<bitset> defines a class template
and several related functions for representing
and manipulating fixed-size sequences of bits
.
#include <string>
#include <iosfwd>
namespace std {
template<size_t N> class bitset;
template<size_t N>
bitset<N> operator&(const bitset<N>&, const bitset<N>&) noexcept;
template<size_t N>
bitset<N> operator|(const bitset<N>&, const bitset<N>&) noexcept;
template<size_t N>
bitset<N> operator^(const bitset<N>&, const bitset<N>&) noexcept;
template<class charT, class traits, size_t N>
basic_istream<charT, traits>&
operator>>(basic_istream<charT, traits>& is, bitset<N>& x);
template<class charT, class traits, size_t N>
basic_ostream<charT, traits>&
operator<<(basic_ostream<charT, traits>& os, const bitset<N>& x);
}
namespace std {
template<size_t N> class bitset {
public:
class reference {
friend class bitset;
reference() noexcept;
public:
reference(const reference&) = default;
~reference();
reference& operator=(bool x) noexcept;
reference& operator=(const reference&) noexcept;
bool operator~() const noexcept;
operator bool() const noexcept;
reference& flip() noexcept;
};
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<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);
constexpr bool operator[](size_t pos) const;
reference operator[](size_t pos);
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 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;
};
template<class T> struct hash;
template<size_t N> struct hash<bitset<N>>;
}
The class template
bitset<N>
describes an object that can store a sequence consisting of a fixed number of
bits,
N.Each bit represents either the value zero (reset) or one (set)
. To
toggle
a bit is to change the value zero to one, or the value one to
zero
. Each bit has a non-negative position
pos. When converting
between an object of class
bitset<N>
and a value of some
integral type, bit position
pos corresponds to the
bit value
1 << pos. The integral value corresponding to two
or more bits is the sum of their bit values
.The functions described in this subclause can report three kinds of
errors, each associated with a distinct exception:
constexpr bitset() noexcept;
Effects: Initializes all bits in
*this to zero
. constexpr bitset(unsigned long long val) noexcept;
Effects: Initializes the first
M bit positions to the corresponding bit
values in
val. If
M < N, the remaining bit positions are initialized to zero
.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'));
Effects: Determines the effective length
rlen of the initializing string as the smaller of
n and
str.size() - pos. Initializes the first
M bit
positions to values determined from the corresponding characters in the string
str. M is the smaller of
N and
rlen. An element of the constructed object has value zero if the
corresponding character in
str, beginning at position
pos, is
zero. Otherwise, the element has the value one
. Character position
pos + M - 1 corresponds to bit position zero
. Subsequent decreasing character positions correspond to increasing bit positions
.If
M < N, remaining bit positions are initialized to zero
.The function uses
traits::eq
to compare the character values
.Throws: out_of_range if
pos > str.size() or
invalid_argument if any of
the
rlen characters in
str
beginning at position
pos
is other than
zero or
one. 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: As if by:
bitset(n == basic_string<charT>::npos
? basic_string<charT>(str)
: basic_string<charT>(str, n),
0, n, zero, one)
bitset<N>& operator&=(const bitset<N>& rhs) noexcept;
Effects: Clears each bit in
*this
for which the corresponding bit in
rhs is clear, and leaves all other bits unchanged
.
bitset<N>& operator|=(const bitset<N>& rhs) noexcept;
Effects: Sets each bit in
*this
for which the corresponding bit in
rhs is set, and leaves all other bits unchanged
. bitset<N>& operator^=(const bitset<N>& rhs) noexcept;
Effects: Toggles each bit in
*this
for which the corresponding bit in
rhs is set, and leaves all other bits unchanged
. bitset<N>& operator<<=(size_t pos) noexcept;
Effects: Replaces each bit at position
I in
*this
with a value determined as follows:
- If I < pos, the new value is zero;
- If I >= pos, the new value is the previous
value of the bit at position I - pos.
bitset<N>& operator>>=(size_t pos) noexcept;
Effects: Replaces each bit at position
I in
*this
with a value determined as follows:
- If pos >= N - I, the new value is zero;
- If pos < N - I, the new value is the previous value of the bit at position I + pos.
bitset<N>& set() noexcept;
Effects: Sets all bits in
*this. bitset<N>& set(size_t pos, bool val = true);
Effects: Stores a new value in the bit at position
pos in
*this. If
val is
true, the stored value is one, otherwise it is zero
.Throws: out_of_range if
pos does not correspond to a valid bit position
. bitset<N>& reset() noexcept;
Effects: Resets all bits in
*this. bitset<N>& reset(size_t pos);
Effects: Resets the bit at position
pos in
*this. Throws: out_of_range if
pos does not correspond to a valid bit position
. bitset<N> operator~() const noexcept;
Effects: Constructs an object
x of class
bitset<N>
and initializes it with
*this. bitset<N>& flip() noexcept;
Effects: Toggles all bits in
*this. bitset<N>& flip(size_t pos);
Effects: Toggles the bit at position
pos in
*this. Throws: out_of_range if
pos does not correspond to a valid bit position
. unsigned long to_ulong() const;
Throws: overflow_error if the integral value
x
corresponding to the bits in
*this
cannot be represented as type
unsigned long. unsigned long long to_ullong() const;
Throws: overflow_error if the integral value
x
corresponding to the bits in
*this
cannot be represented as type
unsigned long long. 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: Constructs a string object of the appropriate type
and initializes it to a string of length
N characters
. Each character is determined by the value of its corresponding bit position in
*this. Character position
N - 1 corresponds to bit position zero
. Subsequent decreasing character positions correspond to increasing bit
positions
. Bit value zero becomes the character
zero,
bit value one becomes the character
one.Returns: The created object
.
size_t count() const noexcept;
Returns: A count of the number of bits set in
*this. constexpr size_t size() const noexcept;
bool operator==(const bitset<N>& rhs) const noexcept;
Returns: true if the value of each bit in
*this
equals the value of the corresponding bit in
rhs. bool test(size_t pos) const;
Returns: true
if the bit at position
pos
in
*this
has the value one
. Throws: out_of_range if
pos does not correspond to a valid bit position
.
bool all() const noexcept;
Returns: count() == size(). bool any() const noexcept;
bool none() const noexcept;
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;
Preconditions: pos is valid
. Returns: true if the bit at position
pos in
*this has the value
one, otherwise
false. bitset<N>::reference operator[](size_t pos);
Preconditions: pos is valid
. Returns: An object of type
bitset<N>::reference
such that
(*this)[pos] == this->test(pos),
and such that
(*this)[pos] = val
is equivalent to
this->set(pos, val). Remarks: For the purpose of determining the presence of a
data race, any access or update through the resulting
reference potentially accesses or modifies, respectively, the entire
underlying bitset
.