在C++11之前,bitset属于11个容器类中的一个(分别是deque, list, queue, priority_queue, stack, vector, map, multimap, set, multiset和bitset)。后来C++11新增了forward_list, unordered_map, unordered_multimap, unordered_set和unordered_multiset,且不将bitset视为容器,而将其视为一种独立的类别。
C++提供的bitset类方便我们进行各种位操作,使用时需包含头文件< bitset>,bitset类位于std命名空间中
template <size_t N>
class bitset
{
...
};
size_t 可看作 unsigned int。将 bitset 实例化时,N是非类型模板参数, 必须是一个整型常数,指明了实例化的bitset占用多少个位。例如:
bitset <40> bst;
则 bst 是一个由 40 个位组成的对象,用 bitset 的成员函数可以方便地访问其中任意一位。bitset 中的位从 0 开始编号,第 0 位是最右边的位。
常用的构造方法
- 默认无参构造
初始化全部位为0 - 十进制或者16进制数值
std::bitset<8> bs(7);
bs.to_string() // 0000 0111
std::bitset<8> bs(0x07);
bs.to_string() // 0000 0111
- 移植性更好的的构造方式:
bitset<numeric_limits<unsigned short>::digits> bs1(267); // 16位
bitset<numeric_limits<unsigned long>::digits> bs2(267); // 32位
- 用string对象
std::bitset<8> bs("00000111");
bs.to_ulong(); // 7
- 迭代器构造
std::bitset<8> bs(string(bin.rbegin(), bin.rend())); // 注意这里反向
成员函数
bitset 有许多成员函数,有些成员函数执行的就是类似于位运算的操作。bitset 成员函数列表如下:
bitset <N> & operator &= (const bitset <N> & rhs); //和另一个 bitset 对象进行与操作
bitset <N> & operator |= (const bitset <N> & rhs); //和另一个 bitset 对象进行或操作
bitset <N> & operator ^= (const bitset <N> & rhs); //和另一个 bitset 对象进行异或操作
bitset <N> & operator <<= (size_t num); //左移 num 位
bitset <N> & operator >>= (size_t num); //右移 num 位
bitset <N> & set(); //将所有位全部设成 1
bitset <N> & set(size_t pos, bool val = true); //将第 pos 位设为 val
bitset <N> & reset(); //将所有位全部设成0
bitset <N> & reset (size_t pos); //将第 pos 位设成 0
bitset <N> & flip(); //将所有位翻转(0变成1,1变成0)
bitset <N> & flip(size_t pos); //翻转第 pos 位
reference operator[] (size_t pos); //返回对第 pos 位的引用
bool operator[] (size_t pos) const; //返回第 pos 位的值
reference at(size_t pos); //返回对第 pos 位的引用
bool at (size_t pos) const; //返回第 pos 位的值
unsigned long to_ulong() const; //将对象中的0、1串转换成整数
unsigned long long to_ullong() const; //将对象中的0、1串转换成长整数
string to_string () const; //将对象中的0、1串转换成字符串(Visual Studio 支持,Dev C++ 不支持)
size_t count() const; //计算 1 的个数
size_t size () const; //返回总位数
bool operator == (const bitset <N> & rhs) const;
bool operator != (const bitset <N> & rhs) const;
bool test(size_t pos) const; //测试第 pos 位是否为 1
bool any() const; //判断是否有某位为1
bool none() const; //判断是否全部为0
bitset <N> operator << (size_t pos) const; //返回左移 pos 位后的结果
bitset <N> operator >> (size_t pos) const; //返回右移 pos 位后的结果
bitset <N> operator ~ (); //返回取反后的结果
bitset <N> operator & (const bitset <N> & rhs) const; //返回和另一个 bitset 对象 rhs 进行与运算的结果
bitset <N> operator | (const bitset <N> & rhs) const; //返回和另一个 bitset 对象 rhs 进行或运算的结果
bitset <N> operator ^ (const bitset <N> & rhs) const; //返回和另一个 bitset 对象 rhs 进行异或运算的结果