STL源码分析--bitset

时间:2021-02-26 13:29:10   收藏:0   阅读:0

更多精彩内容,请关注微信公众号:后端技术小屋

1 相关头文件

bitset

2 bitset

bitset中STL中用于表示位图的容器,它支持读写特定bit、从整数或字符串生成bitset对象。bitset大小通过模板参数指定,一旦编译器确定便无法变更,这一点与vector<bool>有差异。

2.1 数据结构

bitset_Base_bitset的派生类。_Base_bitset中包含一个长度_Nw,类型unsigned long的数组,其中_Nw通过模板参数指定。在64位系统中,unsigned long长度为8 Byte。

注意,这里_Nb不一定是8 * sizeof(unsigned)的整数倍,所以需要宏__BITSET_WORDS对其进行向上取整操作。

template<size_t _Nb>
class bitset : private _Base_bitset<__BITSET_WORDS(_Nb)>
{
private:
  typedef _Base_bitset<__BITSET_WORDS(_Nb)> _Base;
  typedef unsigned long _WordT;
  ...
}

template<size_t _Nw>
struct _Base_bitset {
  typedef unsigned long _WordT;

  _WordT _M_w[_Nw];                // 0 is the least significant word.
  ...
}

2.2 重要接口

  bitset(unsigned long __val) : _Base_bitset<__BITSET_WORDS(_Nb)>(__val)
    { _M_do_sanitize(); }

  _Base_bitset(unsigned long __val) {
    _M_do_reset();
    _M_w[0] = __val;
  }

  void _M_do_sanitize() {
    _Sanitize<_Nb%__BITS_PER_WORD>::_M_do_sanitize(this->_M_hiword());
  }

template <size_t _Extrabits> struct _Sanitize {
  static void _M_do_sanitize(unsigned long& __val)
    { __val &= ~((~static_cast<unsigned long>(0)) << _Extrabits); }
};

__STL_TEMPLATE_NULL struct _Sanitize<0> {
  static void _M_do_sanitize(unsigned long) {}
};

  explicit bitset(const basic_string<char>& __s,
                  size_t __pos = 0,
                  size_t __n = basic_string<char>::npos)
    : _Base()
  {
    if (__pos > __s.size())
      __STL_THROW(out_of_range("bitset"));
    _M_copy_from_string(__s, __pos, __n);
  }
      const size_t __sub_offset = __BITS_PER_WORD - __offset;
      for (size_t __n = _Nw - 1; __n > __wshift; --__n)
        _M_w[__n] = (_M_w[__n - __wshift] << __offset) |
                    (_M_w[__n - __wshift - 1] >> __sub_offset);
      _M_w[__wshift] = _M_w[0] << __offset;
    }
      const size_t __sub_offset = __BITS_PER_WORD - __offset;
      for (size_t __n = 0; __n < __limit; ++__n)
        _M_w[__n] = (_M_w[__n + __wshift] >> __offset) |
                    (_M_w[__n + __wshift + 1] << __sub_offset);
      _M_w[__limit] = _M_w[_Nw-1] >> __offset;

留下问题给读者思考:为何bitset中的数组类型是unsigned long而非unsigned char?

推荐阅读

更多精彩内容,请扫码关注微信公众号:后端技术小屋。如果觉得文章对你有帮助的话,请多多分享、转发、在看。
技术图片

评论(0
© 2014 mamicode.com 版权所有 京ICP备13008772号-2  联系我们:gaon5@hotmail.com
迷上了代码!