C++之std::bitset使用精讲(全)

目录

1.简介

2.定义与初始化

3.操作接口

4.高级用法

5.线程安全性

6.std::bitset的应用

6.1快速判断某个数据是否在一个集合中

6.2.求两个集合的交集、并集等

6.3.数据统计次数

7.总结


1.简介

 std::bitset也叫位图,它的定义如下:

template <size_t N> 
class bitset

   类模板 bitset 表示一个 N 位的固定大小序列。可以用标准逻辑运算符操作 bitset,并将它与字符串和整数相互转换。对于字符串表示和移位操作的列举方向来说,这个序列被当做最低索引元素位于右侧,类似于整数的二进制表示。这个类提供了一些方便的方法来操作位,例如设置、重置、翻转位等。

2.定义与初始化

   std::bitset 满足可复制构造 (CopyConstructible) 可复制赋值 (CopyAssignable) 的要求。

         下面是 std::bitset 类型的创建方式:

std::bitset<N> bitset1; // 创建一个长度为 N 的 bitset,所有位都被初始化为 0
std::bitset<N> bitset2(value); // 使用二进制整数 value 初始化一个长度为 N 的 bitset
std::bitset<32> bitset21(0xffff);          // bits 0 ... 15 are set to 1; 16 ... 31 are 0
std::bitset<128> bitset22(0xffff);         // bits 32 through 127 initialized to zero

std::bitset<N> bitset3(string); // 使用二进制字符串 string 初始化一个长度为 N 的 bitset
string str("1111111000000011001101");
std::bitset<N> bitset31(str);    //用整个字符串来初始化bitset
std::bitset<32> bitset32(str, 5, 4); // 4 bits starting at str[5], 1100
std::bitset<32> bitset33(str, str.size() - 4);     // use last 4 characters

std::bitset<N> bitset4(bitset); // 使用另一个 bitset 初始化一个长度为 N 的 bitset
std::bitset<n> bitset5(bitset4, pos, n);	  //bitset5是bitset4中从位置pos开始的n个位的副本

        类似于vector,bitset类是一种类模板;而与vector不一样的是bitset类型对象的区别仅在其长度而不在其类型。在定义bitset时,要明确bitset含有多少位,须在尖括号内给出它的长度值:

bitset<32> bitvec; //32位,全为0。

        给出的长度值必须是常量表达式。正如这里给出的,长度值必须定义为整型字面值常量或是已用常量值初始化的整数类型的const对象。
  这条语句把bitvec定义为含有32个位的bitset对象。和vector的元素一样,bitset中的位是没有命名的,程序员只能按位置来访问它们。位集合的位置编号从0开始,因此,bitvec的位序是从0到31。以0位开始的位串是低阶位(low-order bit),以31位结束的位串是高阶位(high-order bit)。

3.操作接口

        多种bitset操作用来测试或设置bitset对象中的单个或多个二进制位:

        这些函数使得 std::bitset 成为处理位级别数据的强大工具。示例如下:

#include <bitset>
#include <cassert>
#include <cstddef>
#include <iostream>
 
int main()
{
    typedef std::size_t length_t, position_t; // 提示
 
    // 构造函数:
    constexpr std::bitset<4> b1;
    constexpr std::bitset<4> b2{0xA}; // == 0B1010
    std::bitset<4> b3{"0011"}; // C++23 起也可以为 constexpr
    std::bitset<8> b4{"ABBA", length_t(4), /*0:*/'A', /*1:*/'B'}; // == 0B0000'0110
 
    // 能打印出 bitset 到流:
    std::cout << "b1:" << b1 << "; b2:" << b2 << "; b3:" << b3 << "; b4:" << b4 << '\n';
 
    // bitset 支持逐位运算:
    b3 |= 0b0100; assert(b3 == 0b0111);
    b3 &= 0b0011; assert(b3 == 0b0011);
    b3 ^= std::bitset<4>{0b1100}; ass
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值