13.2 <bitset>
The <bitset> header declares a single class template,
bitset, and some related functions. A
bitset is a fixed-size sequence of bits. The
bitwise operators (&, |,
^, etc.) are overloaded to work with
bitsets in the usual manner, and you can refer to
individual bits by index.
The Boost project has a class template for a bit sequence that can
change size at runtime. See Appendix B for
information about Boost.
bitset class template |
Fixed-size sequence of bits
|
template<size_t N>
class bitset {
public:
// Proxy class to simulate a bit reference
class reference {
friend class bitset;
reference( );
public:
~reference( );
reference& operator=(bool x);
reference& operator=(const reference&);
bool operator~( ) const;
operator bool( ) const;
reference& flip( );
};
// Constructors
bitset( );
bitset(unsigned long val);
template<typename charT, typename traits, typename A>
explicit bitset(const basic_string<charT,traits,A>& s, typename
basic_string<charT,traits,A>::size_type p=0, typename basic
string<charT,traits,A>::size_type n = basic_string<charT,traits,A>::npos);
// bitset operations
bitset<N>& operator&=(const bitset<N>& rhs);
bitset<N>& operator|=(const bitset<N>& rhs);
bitset<N>& operator^=(const bitset<N>& rhs);
bitset<N>& operator<<=(size_t pos);
bitset<N>& operator>>=(size_t pos);
bitset<N>& set( );
bitset<N>& set(size_t pos, int val=true);
bitset<N>& reset( );
bitset<N>& reset(size_t pos);
bitset<N> operator~( ) const;
bitset<N>& flip( );
bitset<N>& flip(size_t pos);
// Element access
reference operator[](size_t pos);
bool operator[](size_t pos) const;
unsigned long to_ulong( ) const;
template <typename charT, typename traits, typename Alloc>
basic_string<charT, traits, Alloc> to_string( ) const;
size_t count( ) const;
size_t size( ) const;
bool operator==(const bitset<N>& rhs) const;
bool operator!=(const bitset<N>& rhs) const;
bool test(size_t pos) const;
bool any( ) const;
bool none( ) const;
bitset<N> operator<<(size_t pos) const;
bitset<N> operator>>(size_t pos) const
};
|
|
The bitset class template offers a convenient way
to manipulate a fixed-sized sequence of bits. The number of bits is
specified as a template argument, so each bitset
object can have a different size. Each bit in a
bitset can be set (1 or
true) or reset (0 or
false). Bit positions are numbered from right to
left, that is, 0 is the least-significant bit, and
N - 1 is the most-significant bit.
A bitset is not a standard container and does not
provide iterators or support generic algorithms. For a container that
holds a sequence of bit values, use
vector<int> or
deque<bool>. (See
<vector> later in this chapter to learn
more, including why you should not use
vector<bool>.) In the following member
function descriptions, N is the template parameter
(number of bits):
- bitset( )
-
Resets all bits.
- bitset(unsigned long value)
-
Initializes the first m bits to
value, in which m ==
CHAR_BITS *
sizeof(unsigned long). If
N > m, all other bits are
reset to 0. If N <
m, excess bits of m are
ignored.
template<typename charT, typename traits, typename A>
explicit bitset(const basic_string<charT,traits,A>& s,
typename basic_string<charT,traits,A>::size_type p=0,
typename basic_string<charT,traits,A>::size_type n=
basic_string<charT,traits,A>::npos)
-
Initializes the bitset from the character string
s, starting at index p and
extending for n characters (or to the end of the
string, whichever comes first). The default is to use all characters
in the string. A character equal to '0' resets a
bit, '1' sets a bit, and any other character
causes the constructor to throw invalid_argument.
The rightmost character of the substring (that is, the character
s[p+n-1] or the rightmost character of
s) initializes the bit at index 0 of the
bitset, and subsequent bits are initialized by
characters at preceding indices of s. Bits left
uninitialized by the string are reset. All of the
bitsets in the following example are equal to
000111:
bitset<6> a(string("111"));
bitset<6> b(string("000111"));
bitset<6> c(string("10110011100"), 5, 4);
bitset<6> d(string("111111"), 3, 42);
The unwieldy declaration is due to the
basic_string class template. For the common case
of a plain string, you can read the declaration
as:
bitset(const string& s, size_t p=0, size_n n=string::npos)
- bitset<N>& operator&=(const bitset<N>& rhs)
-
Performs *this =
*this &
rhs. Returns *this.
- bitset<N>& operator|=(const bitset<N>& rhs)
-
Performs *this =
*this | rhs.
Returns *this.
- bitset<N>& operator^=(const bitset<N>& rhs)
-
Performs *this =
*this ^ rhs.
Returns *this.
- bitset<N>& operator<<=(size_t pos)
-
Shifts bits to the left by pos positions. Vacated
bits are filled with 0. Returns
*this.
- bitset<N>& operator>>=(size_t pos)
-
Shifts bits to the right by pos positions. Vacated
bits are filled with 0. Returns
*this.
- bool operator==(const bitset<N> rhs)
-
Returns true if every bit in
*this has the same value as the corresponding bit
in rhs.
- bool operator!=(const bitset<N> rhs)
-
Returns true if any bit in
*this has a different value than the corresponding
bit in rhs.
- bitset<N> operator<<(size_t pos)
-
Returns a new bitset with its bits shifted to the
left by pos positions. Vacated bits are filled
with 0.
- bitset<N> operator>>(size_t pos)
-
Returns a new bitset with its bits shifted to the
right by pos positions. Vacated bits are filled
with 0.
- bitset<N> operator~( ) const
-
Returns a new bitset with all bits flipped.
- reference operator[](size_t pos)
-
Returns a bitset::reference object for the bit at
position pos. The behavior is undefined if
pos is out of range.
- bool operator[](size_t pos) const
-
Returns the value of the bit at position pos. The
behavior is undefined if pos is out of range. This
member function was added to the standard as part of the technical
corrigendum (TC1), so it might not yet be supported by some
compilers.
- bool any( ) const
-
Returns true if any bit is set. Returns
false if all bits are 0.
- size_t count( ) const
-
Returns the number of bits set.
- bitset<N>& flip( )
-
Toggles all bits, that is, sets 0 bits to
1 and 1 bits to
0. Returns *this.
- bitset<N>& flip(size_t pos)
-
Toggles the bit at position pos. If
pos is invalid, throws
out_of_range. Returns *this.
- bool none( ) const
-
Returns true if all bits are 0.
Returns false if any bit is set.
- bitset<N>& reset( )
-
Resets all bits. Returns *this.
- bitset<N>& reset(size_t pos)
-
Resets the bit at position pos. If
pos is invalid, throws
out_of_range. Returns *this.
- bitset<N>& set( )
-
Sets all bits. Returns *this.
- bitset<N>& set(size_t pos, int val = true)
-
Sets the bit at position pos to
val != 0. If
pos is invalid, throws
out_of_range. Returns *this.
- size_t size( ) const
-
Returns N.
- bool test(size_t pos) const
-
Returns the value of the bit at position pos.
Throws out_of_range if pos is
invalid.
- template <class charT, class traits, class Allocator>
- basic_string<charT, traits, Allocator>
- to_string( ) const
-
Returns a string representation of the bitset.
Each bit is converted to the character '0' if
reset or '1' if set. Bit position 0 is the
rightmost character (position N - 1).
The compiler cannot deduce the template parameters when calling
to_string, so you must specify them explicitly:
std::bitset<64> bits(std::string("101000111101010101"));
std::string str = bits.template to_string<char, std::char_traits<char>,
std::allocator<char> >( ));
- unsigned long to_ulong( ) const
-
Returns the integral value of the bitset. If
N is too large for unsigned
long, it throws overflow_error.
See Also
<climits>, <vector>
bitset::reference class |
Proxy class for a bit in a bitset
|
class reference {
friend class bitset;
reference( )
public:
~reference( );
reference& operator=(bool x);
reference& operator=(const reference&);
bool operator~( ) const;
operator bool( ) const;
reference& flip( );
};
|
|
The bitset::reference class is a proxy that refers
to a single bit in a bitset. The constructor is
private, so instances can be created only by the
bitset class, particularly by its
operator[] function. The member functions are:
- reference& operator=(bool x)
- reference& operator=(const reference& x)
-
Sets the referenced bit to x in the underlying
bitset. Returns *this.
- bool operator~( ) const
-
Returns the logical negation of the referenced bit.
- operator bool( ) const
-
Returns the value of the referenced bit.
- reference& flip( )
-
Toggles the referenced bit in the underlying
bitset. Returns *this.
See Also
bitset class template
operator& function template |
Performs bitwise and of two bitsets
|
template <size_t N>
bitset<N> operator&(const bitset<N>& a, const bitset<N>& b);
|
|
The & operator takes two
bitsets and returns a new
bitset that represents the bitwise
and of the operands. In other words, an output bit is set
only when the corresponding bit is set in both operands; otherwise,
an output bit is reset.
See Also
bitset class template, operator
|, operator
^, <cstddef>,
bit_and keyword
operator| function template |
Performs bitwise inclusive or of two bitsets
|
template <size_t N>
bitset<N> operator|(const bitset<N>& a, const bitset<N>& b);
|
|
The | operator takes two
bitsets and returns a new
bitset that represents the bitwise
inclusive or of the operands. In other words, an output
bit is set when the corresponding bit is set in either operand, and
an output bit is reset if the corresponding bits in both operands are
0.
See Also
bitset class template, operator
&, operator
^, <cstddef>,
bit_or keyword
operator^ function template |
Performs bitwise exclusive or of two bitsets
|
template <size_t N>
bitset<N> operator^(const bitset<N>& a, const bitset<N>& b);
|
|
The ^ operator takes two
bitsets and returns a new
bitset that represents the bitwise
exclusive or of the operands. In other words, an output
bit is set when the corresponding bits are not equal in either
operand, and an output bit is reset if the corresponding bits in both
operands are identical.
See Also
bitset class template, operator
&, operator
|, <cstddef>,
xor keyword
operator >>function template |
Reads a bitset
|
template <typename charT, typename traits, size_t N>
basic_istream<charT, traits)& operator>>(basic_istream<charT, traits)&
in, const bitset<N>& x);
|
|
The >> operator reads a
bitset from an input stream. It extracts up to
N characters and constructs a
bitset object using the same format as the string
constructor.
Only '0' and '1' characters are
extracted. Input stops when it reaches any other character (without
extracting that other character).
See Also
bitset class template, operator
<<, <istream>,
<cstddef>
operator<< function template |
Writes a bitset
|
template <typename charT, typename traits, size_t N>
basic_ostream<charT, traits)& operator<<(basic_ostream<charT, traits)& in,
const bitset<N>& x);
|
|
The << operator writes a
bitset on an output stream, using the same format
as the to_string member function.
See Also
bitset class template, operator
>>, <cstddef>,
<ostream>
|