当前位置: 代码迷 >> 综合 >> 位存储模板类:bitset
  详细解决方案

位存储模板类:bitset

热度:20   发布时间:2023-11-21 04:41:26.0
为了使程序员更好地操作二进制位,C++STL定义了一个操作二进制位集合的模板类:bitset。
不指定初始值时,bitset的所有位都默认初始化为0。我们可以从一个string或一个字符数组指针来初始化bitset。两种情况下,字符都直接表示位模式,即字符串中下标最小的字符表示最高位,反之亦然。如果string包含的字符数比bitset少,则bitset的高位被置为0。
bitset<8> b("1101");//b为00001101
也可以使用string的一部分作为bitset的初始值:
string s("11010111");
bitset<16> b(s, 5, 4);//从s[5]开始的4个字符作为biset的初始值,则b为0000000000000111

bitset操作

访问

访问符[]

bitset提供两种版本的访问符[]
constexpr bool operator[]( std::size_t pos ) const;
reference operator[]( std::size_t pos );

因此,我们可以像操作数组一样通过[]来访问和修改bitset中对应位的值,但要注意的是,下标为0对应bitset的最低位,反之亦然。如bitset<4> b("1100"),b[0]对应的值是0


test
test也能访问bitset元素,并且提供越界检查,但它只能访问不能对元素做任何修改。

bool test( size_t pos ) const;


其余操作如下:
bool all() const; //判断bitset中是否所有位都被置为1
bool any() const; //判断bitset中是否有任意位被置为1
bool none() const; //判断bitset中是否所有位都被置为0

std::size_t count() const; //计算bitset中被置为1的位数

容量

constexpr std::size_t size() const noexcept; //返回bitset的大小

位运算

此外,bitset还提供各种常见的位运算符,如:与&=、或|=、非~、异或^=、移位(左移<<=和右移>>=),与&、|、等不同的是,它们是对bitset整体的操作,且对象是bitset。
bitset<N>& operator&=( const bitset<N>& other );
bitset<N>& operator|=( const bitset<N>& other );
bitset<N>& operator^=( const bitset<N>& other );

bitset<N> operator~() const;


另外还有三个对bitset整体的操作:
set
bitset<N>& set(); //将bitset的所有位都置为1

bitset<N>& set( size_t pos, bool value = true ); //将指定位置为value(默认为true,即1)


reset
与set相反
bitset<N>& reset(); //将所有位置为0

bitset<N>& reset( size_t pos ); //将指定位置为0,没有第二参数


flip
位取反
bitset<N>& reset( size_t pos ); //将所有位取反
bitset<N>& flip( size_t pos ); //将指定位取反

其他操作

template<class CharT = char, class Traits = std::char_traits<CharT>, class Allocator = std::allocator<CharT>> 
std::basic_string<CharT,Traits,Allocator> to_string(CharT zero = CharT('0'), CharT one = CharT('1')) const;
        to_string将bitset转化为字符串,默认二进制位0转换为'0',二进制位1转换为'1',也可以自行指定字符。
此外还有to_ulong和to_ullong分别将bitset转换为对应的unsigned long型和unsigned long long型数据。