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

2024-06-04 2223阅读

目录

1.简介

2.定义与初始化

3.操作接口

4.高级用法

5.线程安全性

6.std::bitset的应用

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

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

6.3.数据统计次数

7.总结


1.简介

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

template  
class bitset

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

2.定义与初始化

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

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

std::bitset bitset1; // 创建一个长度为 N 的 bitset,所有位都被初始化为 0
std::bitset bitset2(value); // 使用二进制整数 value 初始化一个长度为 N 的 bitset
std::bitset bitset21(0xffff);          // bits 0 ... 15 are set to 1; 16 ... 31 are 0
std::bitset bitset22(0xffff);         // bits 32 through 127 initialized to zero
std::bitset bitset3(string); // 使用二进制字符串 string 初始化一个长度为 N 的 bitset
string str("1111111000000011001101");
std::bitset bitset31(str);    //用整个字符串来初始化bitset
std::bitset bitset32(str, 5, 4); // 4 bits starting at str[5], 1100
std::bitset bitset33(str, str.size() - 4);     // use last 4 characters
std::bitset bitset4(bitset); // 使用另一个 bitset 初始化一个长度为 N 的 bitset
std::bitset bitset5(bitset4, pos, n);	  //bitset5是bitset4中从位置pos开始的n个位的副本

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

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

        给出的长度值必须是常量表达式。正如这里给出的,长度值必须定义为整型字面值常量或是已用常量值初始化的整数类型的const对象。

  这条语句把bitvec定义为含有32个位的bitset对象。和vector的元素一样,bitset中的位是没有命名的,程序员只能按位置来访问它们。位集合的位置编号从0开始,因此,bitvec的位序是从0到31。以0位开始的位串是低阶位(low-order bit),以31位结束的位串是高阶位(high-order bit)。

3.操作接口

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

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

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

#include 
#include 
#include 
#include 
 
int main()
{
    typedef std::size_t length_t, position_t; // 提示
 
    // 构造函数:
    constexpr std::bitset b1;
    constexpr std::bitset b2{0xA}; // == 0B1010
    std::bitset b3{"0011"}; // C++23 起也可以为 constexpr
    std::bitset b4{"ABBA", length_t(4), /*0:*/'A', /*1:*/'B'}; // == 0B0000'0110
 
    // 能打印出 bitset 到流:
    std::cout 

    免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

    目录[+]