STLdoc
STLdocumentation
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
Macros | Functions
bitset File Reference
#include <string>
#include <bits/functexcept.h>
#include <iosfwd>
#include <bits/cxxabi_forced.h>
#include <bitset>

Macros

#define _GLIBCXX_BITSET   1
 
#define _GLIBCXX_BITSET_BITS_PER_WORD   (__CHAR_BIT__ * __SIZEOF_LONG__)
 
#define _GLIBCXX_BITSET_WORDS(__n)
 
#define _GLIBCXX_BITSET_BITS_PER_ULL   (__CHAR_BIT__ * __SIZEOF_LONG_LONG__)
 
#define _GLIBCXX_PROFILE_BITSET
 

Functions

namespace std _GLIBCXX_VISIBILITY (default)
 

Detailed Description

This file is a GNU profile extension to the Standard C++ Library.

Macro Definition Documentation

#define _GLIBCXX_BITSET   1
#define _GLIBCXX_BITSET_BITS_PER_ULL   (__CHAR_BIT__ * __SIZEOF_LONG_LONG__)
#define _GLIBCXX_BITSET_BITS_PER_WORD   (__CHAR_BIT__ * __SIZEOF_LONG__)
#define _GLIBCXX_BITSET_WORDS (   __n)
Value:
((__n) % _GLIBCXX_BITSET_BITS_PER_WORD == 0 ? 0 : 1))
#define _GLIBCXX_BITSET_BITS_PER_WORD
Definition: bitset:53
#define _GLIBCXX_PROFILE_BITSET

Function Documentation

namespace std _GLIBCXX_VISIBILITY ( default  )

Base class, general case. It is a class invariant that _Nw will be nonnegative.

See documentation for bitset.

0 is the least significant word.

Base class, specialization for a single word.

See documentation for bitset.

Base class, specialization for no storage (zero-length bitset).

See documentation for bitset.

The bitset class represents a fixed-size sequence of bits.

(Note that bitset does not meet the formal requirements of a container. Mainly, it lacks iterators.)

The template argument, Nb, may be any non-negative number, specifying the number of bits (e.g., "0", "12", "1024*1024").

In the general unoptimized case, storage is allocated in word-sized blocks. Let B be the number of bits in a word, then (Nb+(B-1))/B words will be used for storage. B - NbB bits are unused. (They are the high-order bits in the highest word.) It is a class invariant that those unused bits are always zero.

If you think of bitset as a simple array of bits, be aware that your mental picture is reversed: a bitset behaves the same way as bits in integers do, with the bit at index 0 in the least significant / right-hand position, and the bit at index Nb-1 in the most significant / left-hand position. Thus, unlike other containers, a bitset's index counts from right to left, to put it very loosely.

This behavior is preserved when translating to and from strings. For example, the first line of the following program probably prints b('a') is 0001100001 on a modern ASCII system.

#include <bitset>
#include <iostream>
#include <sstream>
using namespace std;
int main()
{
long a = 'a';
bitset<10> b(a);
cout << "b('a') is " << b << endl;
ostringstream s;
s << b;
string str = s.str();
cout << "index 3 in the string is " << str[3] << " but\n"
<< "index 3 in the bitset is " << b[3] << endl;
}

Also see: http://gcc.gnu.org/onlinedocs/libstdc++/manual/bk01pt12ch33s02.html for a description of extensions.

Most of the actual code isn't contained in bitset<> itself, but in the base class _Base_bitset. The base class works with whole words, not with individual bits. This allows us to specialize _Base_bitset for the important special case where the bitset is only a single word.

Extra confusion can result due to the fact that the storage for _Base_bitset is a regular array, and is indexed as such. This is carefully encapsulated.

This encapsulates the concept of a single bit. An instance of this class is a proxy for an actual bit; this way the individual bit operations are done as faster word-size bitwise instructions.

Most users will never need to use this class directly; conversions to and from bool are automatic and should be transparent. Overloaded operators help to preserve the illusion.

(On a typical system, this bit reference is 64 times the size of an actual bit. Ha.)

All bits set to zero.

Initial bits bitwise-copied from a single word (others set to zero).

Use a subset of a string.

Parameters
__sA string of 0 and 1 characters.
__positionIndex of the first character in __s to use; defaults to zero.
Exceptions
std::out_of_rangeIf pos is bigger the size of __s.
std::invalid_argumentIf a character appears in the string which is neither 0 nor 1.

Use a subset of a string.

Parameters
__sA string of 0 and 1 characters.
__positionIndex of the first character in __s to use.
__nThe number of characters to copy.
Exceptions
std::out_of_rangeIf __position is bigger the size of __s.
std::invalid_argumentIf a character appears in the string which is neither 0 nor 1.

Operations on bitsets.

Parameters
__rhsA same-sized bitset.

These should be self-explanatory.

Operations on bitsets.

Parameters
__positionThe number of places to shift.

These should be self-explanatory.

These versions of single-bit set, reset, flip, and test are extensions from the SGI version. They do no range checking.

Sets every bit to true.

Sets a given bit to a particular value.

Parameters
__positionThe index of the bit.
__valEither true or false, defaults to true.
Exceptions
std::out_of_rangeIf pos is bigger the size of the set.

Sets every bit to false.

Sets a given bit to false.

Parameters
__positionThe index of the bit.
Exceptions
std::out_of_rangeIf pos is bigger the size of the set.

Same as writing set(pos,false).

Toggles every bit to its opposite value.

Toggles a given bit to its opposite value.

Parameters
__positionThe index of the bit.
Exceptions
std::out_of_rangeIf pos is bigger the size of the set.

See the no-argument flip().

Array-indexing support.

Parameters
__positionIndex into the bitset.
Returns
A bool for a const bitset. For non-const bitsets, an instance of the reference proxy class.
Note
These operators do no range checking and throw no exceptions, as required by DR 11 to the standard.

_GLIBCXX_RESOLVE_LIB_DEFECTS Note that this implementation already resolves DR 11 (items 1 and 2), but does not do the range-checking required by that DR's resolution. -pme The DR has since been changed: range-checking is a precondition (users' responsibility), and these functions must not throw. -pme

Returns a numerical interpretation of the bitset.

Returns
The integral equivalent of the bits.
Exceptions
std::overflow_errorIf there are too many bits to be represented in an unsigned long.

Returns a character interpretation of the bitset.

Returns
The string equivalent of the bits.

Note the ordering of the bits: decreasing character positions correspond to increasing bit positions (see the main class notes for an example).

Returns the number of bits which are set.

Returns the total number of bits.

These comparisons for equality/inequality are, well, bitwise.

Tests the value of a bit.

Parameters
__positionThe index of a bit.
Returns
The value at pos.
Exceptions
std::out_of_rangeIf pos is bigger the size of the set.

Tests whether all the bits are on.

Returns
True if all the bits are set.

Tests whether any of the bits are on.

Returns
True if at least one bit is set.

Tests whether any of the bits are on.

Returns
True if none of the bits are set.

Self-explanatory.

Finds the index of the first "on" bit.

Returns
The index of the first bit set, or size() if not found.
See Also
_Find_next

Finds the index of the next "on" bit after prev.

Returns
The index of the next bit set, or size() if not found.
Parameters
__prevWhere to start searching.
See Also
_Find_first

Global bitwise operations on bitsets.

Parameters
__xA bitset.
__yA bitset of the same size as __x.
Returns
A new bitset.

These should be self-explanatory.

Global I/O operators for bitsets.

Direct I/O between streams and bitsets is supported. Output is straightforward. Input will skip whitespace, only accept 0 and 1 characters, and will only extract as many digits as the bitset will hold.

Class std::bitset wrapper with performance instrumentation.

61  : _Base_ref(__x)
62  { }
63 
64  reference&
65  operator=(bool __x) _GLIBCXX_NOEXCEPT
66  {
67  *static_cast<_Base_ref*>(this) = __x;
68  return *this;
69  }
70 
71  reference&
72  operator=(const reference& __x) _GLIBCXX_NOEXCEPT
73  {
74  *static_cast<_Base_ref*>(this) = __x;
75  return *this;
76  }
77 
78  bool
79  operator~() const _GLIBCXX_NOEXCEPT
80  {
81  return ~(*static_cast<const _Base_ref*>(this));
82  }
83 
84  operator bool() const _GLIBCXX_NOEXCEPT
85  {
86  return *static_cast<const _Base_ref*>(this);
87  }
88 
89  reference&
90  flip() _GLIBCXX_NOEXCEPT
91  {
92  _Base_ref::flip();
93  return *this;
94  }
95  };
96 
97  // 23.3.5.1 constructors:
98  _GLIBCXX_CONSTEXPR bitset() _GLIBCXX_NOEXCEPT
99  : _Base() { }
100 
101 #if __cplusplus >= 201103L
102  constexpr bitset(unsigned long long __val) noexcept
103 #else
104  bitset(unsigned long __val)
105 #endif
106  : _Base(__val) { }
107 
108  template<typename _CharT, typename _Traits, typename _Alloc>
109  explicit
110  bitset(const std::basic_string<_CharT, _Traits, _Alloc>& __str,
111  typename std::basic_string<_CharT, _Traits, _Alloc>::size_type
112  __pos = 0,
113  typename std::basic_string<_CharT, _Traits, _Alloc>::size_type
114  __n = (std::basic_string<_CharT, _Traits, _Alloc>::npos))
115  : _Base(__str, __pos, __n) { }
116 
117  // _GLIBCXX_RESOLVE_LIB_DEFECTS
118  // 396. what are characters zero and one.
119  template<class _CharT, class _Traits, class _Alloc>
120  bitset(const std::basic_string<_CharT, _Traits, _Alloc>& __str,
121  typename std::basic_string<_CharT, _Traits, _Alloc>::size_type
122  __pos,
123  typename std::basic_string<_CharT, _Traits, _Alloc>::size_type
124  __n,
125  _CharT __zero, _CharT __one = _CharT('1'))
126  : _Base(__str, __pos, __n, __zero, __one) { }
127 
128  bitset(const _Base& __x) : _Base(__x) { }
129 
130 #if __cplusplus >= 201103L
131  template<typename _CharT>
132  explicit
133  bitset(const _CharT* __str,
134  typename std::basic_string<_CharT>::size_type __n
135  = std::basic_string<_CharT>::npos,
136  _CharT __zero = _CharT('0'), _CharT __one = _CharT('1'))
137  : _Base(__str, __n, __zero, __one) { }
138 #endif
139 
140  // 23.3.5.2 bitset operations:
141  bitset<_Nb>&
142  operator&=(const bitset<_Nb>& __rhs) _GLIBCXX_NOEXCEPT
143  {
144  _M_base() &= __rhs;
145  return *this;
146  }
147 
148  bitset<_Nb>&
149  operator|=(const bitset<_Nb>& __rhs) _GLIBCXX_NOEXCEPT
150  {
151  _M_base() |= __rhs;
152  return *this;
153  }
154 
155  bitset<_Nb>&
156  operator^=(const bitset<_Nb>& __rhs) _GLIBCXX_NOEXCEPT
157  {
158  _M_base() ^= __rhs;
159  return *this;
160  }
161 
162  bitset<_Nb>&
163  operator<<=(size_t __pos) _GLIBCXX_NOEXCEPT
164  {
165  _M_base() <<= __pos;
166  return *this;
167  }
168 
169  bitset<_Nb>&
170  operator>>=(size_t __pos) _GLIBCXX_NOEXCEPT
171  {
172  _M_base() >>= __pos;
173  return *this;
174  }
175 
176  bitset<_Nb>&
177  set() _GLIBCXX_NOEXCEPT
178  {
179  _Base::set();
180  return *this;
181  }
182 
183  // _GLIBCXX_RESOLVE_LIB_DEFECTS
184  // 186. bitset::set() second parameter should be bool
185  bitset<_Nb>&
186  set(size_t __pos, bool __val = true)
187  {
188  _Base::set(__pos, __val);
189  return *this;
190  }
191 
192  bitset<_Nb>&
193  reset() _GLIBCXX_NOEXCEPT
194  {
195  _Base::reset();
196  return *this;
197  }
198 
199  bitset<_Nb>&
200  reset(size_t __pos)
201  {
202  _Base::reset(__pos);
203  return *this;
204  }
205 
206  bitset<_Nb>
207  operator~() const _GLIBCXX_NOEXCEPT
208  { return bitset(~_M_base()); }
209 
210  bitset<_Nb>&
211  flip() _GLIBCXX_NOEXCEPT
212  {
213  _Base::flip();
214  return *this;
215  }
216 
217  bitset<_Nb>&
218  flip(size_t __pos)
219  {
220  _Base::flip(__pos);
221  return *this;
222  }
223 
224  // element access:
225  // _GLIBCXX_RESOLVE_LIB_DEFECTS
226  // 11. Bitset minor problems
227  reference
228  operator[](size_t __pos)
229  {
230  return reference(_M_base()[__pos], this);
231  }
232 
233  // _GLIBCXX_RESOLVE_LIB_DEFECTS
234  // 11. Bitset minor problems
235  _GLIBCXX_CONSTEXPR bool
236  operator[](size_t __pos) const
237  {
238  return _Base::operator[](__pos);
239  }
240 
241  using _Base::to_ulong;
242 #if __cplusplus >= 201103L
243  using _Base::to_ullong;
244 #endif
245 
246  template <typename _CharT, typename _Traits, typename _Alloc>
247  std::basic_string<_CharT, _Traits, _Alloc>
248  to_string() const
249  { return _M_base().template to_string<_CharT, _Traits, _Alloc>(); }
250 
251  // _GLIBCXX_RESOLVE_LIB_DEFECTS
252  // 396. what are characters zero and one.
253  template<class _CharT, class _Traits, class _Alloc>
254  std::basic_string<_CharT, _Traits, _Alloc>
255  to_string(_CharT __zero, _CharT __one = _CharT('1')) const
256  {
257  return _M_base().template
258  to_string<_CharT, _Traits, _Alloc>(__zero, __one);
259  }
260 
261  // _GLIBCXX_RESOLVE_LIB_DEFECTS
262  // 434. bitset::to_string() hard to use.
263  template<typename _CharT, typename _Traits>
264  std::basic_string<_CharT, _Traits, std::allocator<_CharT> >
265  to_string() const
266  { return to_string<_CharT, _Traits, std::allocator<_CharT> >(); }
267 
268  // _GLIBCXX_RESOLVE_LIB_DEFECTS
269  // 853. to_string needs updating with zero and one.
270  template<class _CharT, class _Traits>
271  std::basic_string<_CharT, _Traits, std::allocator<_CharT> >
272  to_string(_CharT __zero, _CharT __one = _CharT('1')) const
273  { return to_string<_CharT, _Traits,
274  std::allocator<_CharT> >(__zero, __one); }
275 
276  template<typename _CharT>
277  std::basic_string<_CharT, std::char_traits<_CharT>,
278  std::allocator<_CharT> >
279  to_string() const
280  {
281  return to_string<_CharT, std::char_traits<_CharT>,
282  std::allocator<_CharT> >();
283  }
284 
285  template<class _CharT>
286  std::basic_string<_CharT, std::char_traits<_CharT>,
287  std::allocator<_CharT> >
288  to_string(_CharT __zero, _CharT __one = _CharT('1')) const
289  {
290  return to_string<_CharT, std::char_traits<_CharT>,
291  std::allocator<_CharT> >(__zero, __one);
292  }
293 
294  std::basic_string<char, std::char_traits<char>, std::allocator<char> >
295  to_string() const
296  {
297  return to_string<char,std::char_traits<char>,std::allocator<char> >();
298  }
299 
300  std::basic_string<char, std::char_traits<char>, std::allocator<char> >
301  to_string(char __zero, char __one = '1') const
302  {
303  return to_string<char, std::char_traits<char>,
304  std::allocator<char> >(__zero, __one);
305  }
306 
307  using _Base::count;
308  using _Base::size;
309 
310  bool
311  operator==(const bitset<_Nb>& __rhs) const _GLIBCXX_NOEXCEPT
312  { return _M_base() == __rhs; }
313 
314  bool
315  operator!=(const bitset<_Nb>& __rhs) const _GLIBCXX_NOEXCEPT
316  { return _M_base() != __rhs; }
317 
318  using _Base::test;
319  using _Base::all;
320  using _Base::any;
321  using _Base::none;
322 
323  bitset<_Nb>
324  operator<<(size_t __pos) const _GLIBCXX_NOEXCEPT
325  { return bitset<_Nb>(_M_base() << __pos); }
326 
327  bitset<_Nb>
328  operator>>(size_t __pos) const _GLIBCXX_NOEXCEPT
329  { return bitset<_Nb>(_M_base() >> __pos); }
330 
331  _Base&
332  _M_base() _GLIBCXX_NOEXCEPT
333  { return *this; }
334 
335  const _Base&
336  _M_base() const _GLIBCXX_NOEXCEPT
337  { return *this; }
338  };
339 
340  template<size_t _Nb>
341  bitset<_Nb>
342  operator&(const bitset<_Nb>& __x, const bitset<_Nb>& __y) _GLIBCXX_NOEXCEPT
343  { return bitset<_Nb>(__x) &= __y; }
344 
345  template<size_t _Nb>
346  bitset<_Nb>
347  operator|(const bitset<_Nb>& __x, const bitset<_Nb>& __y) _GLIBCXX_NOEXCEPT
348  { return bitset<_Nb>(__x) |= __y; }
349 
350  template<size_t _Nb>
351  bitset<_Nb>
352  operator^(const bitset<_Nb>& __x, const bitset<_Nb>& __y) _GLIBCXX_NOEXCEPT
353  { return bitset<_Nb>(__x) ^= __y; }
354 
355  template<typename _CharT, typename _Traits, size_t _Nb>
356  std::basic_istream<_CharT, _Traits>&
357  operator>>(std::basic_istream<_CharT, _Traits>& __is, bitset<_Nb>& __x)
358  { return __is >> __x._M_base(); }
359 
360  template<typename _CharT, typename _Traits, size_t _Nb>
361  std::basic_ostream<_CharT, _Traits>&
362  operator<<(std::basic_ostream<_CharT, _Traits>& __os,
363  const bitset<_Nb>& __x)
364  { return __os << __x._M_base(); }
365 } // namespace __profile
366 
367 #if __cplusplus >= 201103L
368  // DR 1182.
370  template<size_t _Nb>
371  struct hash<__profile::bitset<_Nb>>
372  : public __hash_base<size_t, __profile::bitset<_Nb>>
373  {
374  size_t
375  operator()(const __profile::bitset<_Nb>& __b) const noexcept
376  { return std::hash<_GLIBCXX_STD_C::bitset<_Nb>>()(__b._M_base()); }
377  };
378 #endif
379 
380 } // namespace std
381 
382 #endif
383 
bool operator==(const exception_ptr &, const exception_ptr &) _GLIBCXX_USE_NOEXCEPT __attribute__((__pure__))
#define bool
Definition: stdbool.h:33
std::basic_istream< _CharT, _Traits > & operator>>(std::basic_istream< _CharT, _Traits > &__is, basic_string< _CharT, _Traits, _Allocator > &__str)
Definition: string:1122
std::basic_ostream< _CharT, _Traits > & operator<<(std::basic_ostream< _CharT, _Traits > &__os, const basic_string< _CharT, _Traits, _Allocator > &__str)
Definition: string:1116
bool operator!=(const exception_ptr &, const exception_ptr &) _GLIBCXX_USE_NOEXCEPT __attribute__((__pure__))