⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 std_bitset.h

📁 linux下编程用 编译软件
💻 H
📖 第 1 页 / 共 3 页
字号:
      bitset<_Nb>&      _Unchecked_reset(size_t __pos)      {	this->_M_getword(__pos) &= ~_Base::_S_maskbit(__pos);	return *this;      }      bitset<_Nb>&      _Unchecked_flip(size_t __pos)      {	this->_M_getword(__pos) ^= _Base::_S_maskbit(__pos);	return *this;      }      bool      _Unchecked_test(size_t __pos) const      { return ((this->_M_getword(__pos) & _Base::_S_maskbit(__pos))		!= static_cast<_WordT>(0)); }      //@}            // Set, reset, and flip.      /**       *  @brief Sets every bit to true.       */      bitset<_Nb>&      set()      {	this->_M_do_set();	this->_M_do_sanitize();	return *this;      }      /**       *  @brief Sets a given bit to a particular value.       *  @param  position  The index of the bit.       *  @param  val  Either true or false, defaults to true.       *  @throw  std::out_of_range  If @a pos is bigger the size of the %set.       */      bitset<_Nb>&      set(size_t __position, bool __val = true)      {	if (__position >= _Nb)	  __throw_out_of_range(__N("bitset::set"));	return _Unchecked_set(__position, __val);      }      /**       *  @brief Sets every bit to false.       */      bitset<_Nb>&      reset()      {	this->_M_do_reset();	return *this;      }      /**       *  @brief Sets a given bit to false.       *  @param  position  The index of the bit.       *  @throw  std::out_of_range  If @a pos is bigger the size of the %set.       *       *  Same as writing @c set(pos,false).       */      bitset<_Nb>&      reset(size_t __position)      {	if (__position >= _Nb)	  __throw_out_of_range(__N("bitset::reset"));	return _Unchecked_reset(__position);      }            /**       *  @brief Toggles every bit to its opposite value.       */      bitset<_Nb>&      flip()      {	this->_M_do_flip();	this->_M_do_sanitize();	return *this;      }      /**       *  @brief Toggles a given bit to its opposite value.       *  @param  position  The index of the bit.       *  @throw  std::out_of_range  If @a pos is bigger the size of the %set.       */      bitset<_Nb>&      flip(size_t __position)      {	if (__position >= _Nb)	  __throw_out_of_range(__N("bitset::flip"));	return _Unchecked_flip(__position);      }            /// See the no-argument flip().      bitset<_Nb>      operator~() const      { return bitset<_Nb>(*this).flip(); }      //@{      /**       *  @brief  Array-indexing support.       *  @param  position  Index into the %bitset.       *  @return  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.       *       *  @if maint       *  _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       *  @endif       */      reference      operator[](size_t __position)      { return reference(*this,__position); }      bool      operator[](size_t __position) const      { return _Unchecked_test(__position); }      //@}            /**       *  @brief Retuns a numerical interpretation of the %bitset.       *  @return  The integral equivalent of the bits.       *  @throw  std::overflow_error  If there are too many bits to be       *                               represented in an @c unsigned @c long.       */      unsigned long      to_ulong() const      { return this->_M_do_to_ulong(); }      /**       *  @brief Retuns a character interpretation of the %bitset.       *  @return  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).       */      template<class _CharT, class _Traits, class _Alloc>	std::basic_string<_CharT, _Traits, _Alloc>	to_string() const	{	  std::basic_string<_CharT, _Traits, _Alloc> __result;	  _M_copy_to_string(__result);	  return __result;	}      // _GLIBCXX_RESOLVE_LIB_DEFECTS      // 434. bitset::to_string() hard to use.      template<class _CharT, class _Traits>	std::basic_string<_CharT, _Traits, std::allocator<_CharT> >	to_string() const	{ return to_string<_CharT, _Traits, std::allocator<_CharT> >(); }      template<class _CharT>	std::basic_string<_CharT, std::char_traits<_CharT>,	                  std::allocator<_CharT> >	to_string() const	{	  return to_string<_CharT, std::char_traits<_CharT>,	                   std::allocator<_CharT> >();	}      std::basic_string<char, std::char_traits<char>, std::allocator<char> >      to_string() const      {	return to_string<char, std::char_traits<char>,	                 std::allocator<char> >();      }      // Helper functions for string operations.      template<class _CharT, class _Traits, class _Alloc>	void	_M_copy_from_string(const std::basic_string<_CharT,			    _Traits, _Alloc>& __s,			    size_t, size_t);      template<class _CharT, class _Traits, class _Alloc>	void	_M_copy_to_string(std::basic_string<_CharT, _Traits, _Alloc>&) const;      /// Returns the number of bits which are set.      size_t      count() const      { return this->_M_do_count(); }      /// Returns the total number of bits.      size_t      size() const      { return _Nb; }      //@{      /// These comparisons for equality/inequality are, well, @e bitwise.      bool      operator==(const bitset<_Nb>& __rhs) const      { return this->_M_is_equal(__rhs); }      bool      operator!=(const bitset<_Nb>& __rhs) const      { return !this->_M_is_equal(__rhs); }      //@}            /**       *  @brief Tests the value of a bit.       *  @param  position  The index of a bit.       *  @return  The value at @a pos.       *  @throw  std::out_of_range  If @a pos is bigger the size of the %set.       */      bool      test(size_t __position) const      {	if (__position >= _Nb)	  __throw_out_of_range(__N("bitset::test"));	return _Unchecked_test(__position);      }            /**       *  @brief Tests whether any of the bits are on.       *  @return  True if at least one bit is set.       */      bool      any() const      { return this->_M_is_any(); }      /**       *  @brief Tests whether any of the bits are on.       *  @return  True if none of the bits are set.       */      bool      none() const      { return !this->_M_is_any(); }      //@{      /// Self-explanatory.      bitset<_Nb>      operator<<(size_t __position) const      { return bitset<_Nb>(*this) <<= __position; }      bitset<_Nb>      operator>>(size_t __position) const      { return bitset<_Nb>(*this) >>= __position; }      //@}            /**       *  @brief  Finds the index of the first "on" bit.       *  @return  The index of the first bit set, or size() if not found.       *  @ingroup SGIextensions       *  @sa  _Find_next       */      size_t      _Find_first() const      { return this->_M_do_find_first(_Nb); }      /**       *  @brief  Finds the index of the next "on" bit after prev.       *  @return  The index of the next bit set, or size() if not found.       *  @param  prev  Where to start searching.       *  @ingroup SGIextensions       *  @sa  _Find_first       */      size_t      _Find_next(size_t __prev ) const      { return this->_M_do_find_next(__prev, _Nb); }    };  // Definitions of non-inline member functions.  template<size_t _Nb>    template<class _CharT, class _Traits, class _Alloc>      void      bitset<_Nb>::_M_copy_from_string(const std::basic_string<_CharT, _Traits,				       _Alloc>& __s, size_t __pos, size_t __n)      {	reset();	const size_t __nbits = std::min(_Nb, std::min(__n, __s.size() - __pos));	for (size_t __i = 0; __i < __nbits; ++__i)	  {	    switch(__s[__pos + __nbits - __i - 1])	      {	      case '0':		break;	      case '1':		set(__i);		break;	      default:		__throw_invalid_argument(__N("bitset::_M_copy_from_string"));	      }	  }      }  template<size_t _Nb>    template<class _CharT, class _Traits, class _Alloc>      void      bitset<_Nb>::_M_copy_to_string(std::basic_string<_CharT, _Traits,				     _Alloc>& __s) const      {	__s.assign(_Nb, '0');	for (size_t __i = 0; __i < _Nb; ++__i)	  if (_Unchecked_test(__i))	    __s[_Nb - 1 - __i] = '1';      }  // 23.3.5.3 bitset operations:  //@{  /**   *  @brief  Global bitwise operations on bitsets.   *  @param  x  A bitset.   *  @param  y  A bitset of the same size as @a x.   *  @return  A new bitset.   *   *  These should be self-explanatory.  */  template<size_t _Nb>    inline bitset<_Nb>    operator&(const bitset<_Nb>& __x, const bitset<_Nb>& __y)    {      bitset<_Nb> __result(__x);      __result &= __y;      return __result;    }  template<size_t _Nb>    inline bitset<_Nb>    operator|(const bitset<_Nb>& __x, const bitset<_Nb>& __y)    {      bitset<_Nb> __result(__x);      __result |= __y;      return __result;    }  template <size_t _Nb>    inline bitset<_Nb>    operator^(const bitset<_Nb>& __x, const bitset<_Nb>& __y)    {      bitset<_Nb> __result(__x);      __result ^= __y;      return __result;    }  //@}  //@{  /**   *  @brief 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.  */  template<class _CharT, class _Traits, size_t _Nb>    std::basic_istream<_CharT, _Traits>&    operator>>(std::basic_istream<_CharT, _Traits>& __is, bitset<_Nb>& __x)    {      typedef typename _Traits::char_type char_type;      std::basic_string<_CharT, _Traits> __tmp;      __tmp.reserve(_Nb);      std::ios_base::iostate __state = std::ios_base::goodbit;      typename std::basic_istream<_CharT, _Traits>::sentry __sentry(__is);      if (__sentry)	{	  try	    {	      basic_streambuf<_CharT, _Traits>* __buf = __is.rdbuf();	      // _GLIBCXX_RESOLVE_LIB_DEFECTS	      // 303. Bitset input operator underspecified	      const char_type __zero = __is.widen('0');	      const char_type __one = __is.widen('1');	      for (size_t __i = 0; __i < _Nb; ++__i)		{		  static typename _Traits::int_type __eof = _Traits::eof();		  		  typename _Traits::int_type __c1 = __buf->sbumpc();		  if (_Traits::eq_int_type(__c1, __eof))		    {		      __state |= std::ios_base::eofbit;		      break;		    }		  else		    {		      const char_type __c2 = _Traits::to_char_type(__c1);		      if (__c2 == __zero)			__tmp.push_back('0');		      else if (__c2 == __one)			__tmp.push_back('1');		      else if (_Traits::eq_int_type(__buf->sputbackc(__c2),						    __eof))			{			  __state |= std::ios_base::failbit;			  break;			}		    }		}	    }	  catch(...)	    { __is._M_setstate(std::ios_base::badbit); }	}      if (__tmp.empty() && _Nb)	__state |= std::ios_base::failbit;      else	__x._M_copy_from_string(__tmp, static_cast<size_t>(0), _Nb);      if (__state)	__is.setstate(__state);      return __is;    }  template <class _CharT, class _Traits, size_t _Nb>    std::basic_ostream<_CharT, _Traits>&    operator<<(std::basic_ostream<_CharT, _Traits>& __os,	       const bitset<_Nb>& __x)    {      std::basic_string<_CharT, _Traits> __tmp;      __x._M_copy_to_string(__tmp);      return __os << __tmp;    }  //@}} // namespace std#undef _GLIBCXX_BITSET_WORDS#undef _GLIBCXX_BITSET_BITS_PER_WORD#ifdef _GLIBCXX_DEBUG# include <debug/bitset>#endif#endif /* _GLIBCXX_BITSET */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -