STL标准库中的bitset原理解析

STL标准库中的bitset原理解析

bitset简介

  bitset,中文叫位图,类似于每一个元素都是0或者1的数组,但位图的空间利用率比数组高很多。在Linux系统中,位图广泛应用于进程id的分配和文件描述符(file describer)的分配。并且,位图可以用于排序。位图的基本原理是用一个bit位代表一个整数,如果位图中的第N为1,那么就表示整数N存在。

  在c++的STL中实现了位图,包含在头文件中。bitset与vector很相似,都是位的集合,并且提供常数时间的特定位访问。他们之间的差别来自于主要体现在两个方面。首先,bitset的大小是不可变的,它的大小由模板参数N确定,N是整数常量。而vector的大小是可变的;其次,bitset并不是一个序列式容器,更准确地说,bitset并不是标准的STL容器。bitset并没有iterator,也没有begin()和end()。这样设计的理由是bitset中的元素就是bit位,不能容纳任何其他元素,并且bitset中bit位有特定的操作都需要实现,例如与、或、非以及异或。因此,不能够也不需要把bitset设计成STL标准容器。

  关于bitset的用法,请参考http://www.cplusplus.com/reference/bitset/bitset/?kw=bitset

STL中的bitset原理解析

bitset的基类_Base_bitse解析

  这里参考的是sgi版本的STL实现。bitset继承自_Base_bitse。_Base_bitse包含了一个unsigned long的数组,一般地,一个unsigned long有32位,可以表示32个数,最低位的数最小,最高位的数最大。

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

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

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

  在_Base_bitse中有一个对数组_M_w中所有bit为1的位的出现次数的统计函数,函数名为M_do_count,一般的统计方式都是逐位统计。为了提高效率,这里用了一个辅助数组_S_bit_count,这个数组记录了一个0-255中的每个数的二进制表示中有几个1。_S_bit_count的一部分代码如下。

  size_t _M_do_count() const {
    size_t __result = 0;
    const unsigned char* __byte_ptr = (const unsigned char*)_M_w;
    const unsigned char* __end_ptr = (const unsigned char*)(_M_w+_Nw);

    while ( __byte_ptr < __end_ptr ) {
      __result += _Bit_count<true>::_S_bit_count[*__byte_ptr];
      __byte_ptr++;
    }
    return __result;
  }
template<bool __dummy>
unsigned char _Bit_count<__dummy>::_S_bit_count[] = {
  0, /*   0 */ 1, /*   1 */ 1, /*   2 */ 2, /*   3 */ 1, /*   4 */
  2, /*   5 */ 2, /*   6 */ 3, /*   7 */ 1, /*   8 */ 
  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值