当前位置: 首页 > news >正文

位图--Bitset【0基础详细版】

文章目录

  • 概念
  • bitset
  • 初始化和构造
  • 运算操作
  • 访问
  • 常用方法函数
  • 例题训练
    • M - 第九届河北省大学生程序设计竞赛
  • 总结

概念

位图 用一个二进制位(0或1)来标记某个状态或资源是否被占用
第i个元素为0:第i个元素不存在/未被占用。
第i个元素为1:第i个元素存在/被占用。

bitset

简单来说就是01数组或者说是01字符串,然后赋予了整体的一些位运算操作。
优点:
为单位存储,空间复杂度较低。

初始化和构造

一、无参数构造

bit<4>b;//默认构造,所有位初始化为0.
bitset<32>b1;//32是长度,也可以是其他,不够前补0.

二、传入int参数构造

bitset<9>b2(12);//12=000000001100.
//传入一个整数按二进制初始化,不够前补0。

三、传入字符串参数构造

string s1="1001010";
char s2[]="1000111";
bitset<10>b3(s1);//"1001010"="0001001010"
bitset<10>b4(s2);//"1000111"="0001000111"
//传入字符串初始化时,填充位数不足的部分为0。

代码展示

#include<bits/stdc++.h>
using namespace std;
#define int long long
signed main()
{string s1="111001";bitset<4>b;//0000bitset<8>b1(9);//00001001bitset<10>b2(s1);//0000111001cout<<b<<'\n'<<b1<<'\n'<<b2<<'\n';return 0;} 

结果展示
在这里插入图片描述

运算操作

bitset类似数组和字符串,在bitset容器中,不仅基本的赋值运算符(=)和一些关系运算符(==、!=)被重载,还对一些复合赋值运算符(&=、|=、^=、<<=、>>=)和单目运算符(~)进行了重载,当然肯定也是支持位运算的。这使得我们可以直接使用这些运算符来对bitset对象(即位图)进行各种操作,如位的赋值、比较、逻辑运算、位移以及取反等。
例如,以下代码主要展示了如何使用位运算符

#include<bits/stdc++.h>
using namespace std;
int main()
{bitset<8>b1("10101100");bitset<8>b2("11100100");bitset<8>b3;b3=b1&b2;cout<<"b1&b2= "<<b3<<endl;b3=b1|b2;cout<<"b1|b2= "<<b3<<endl;b3=b1^b2;cout<<"b1^b2= "<<b3<<endl;b3=~b1;cout<<" ~ b1= "<<b3<<endl;b3=b1<<2;cout<<"b1<<2= "<<b3<<endl;b3=b2>>2;cout<<"b2>>2= "<<b3<<endl;return 0;} 

在这里插入图片描述

访问

bitset容器还重载了**[ ]运算符**,允许我们直接通过索引来访问或修改bitset中指定位置的位。

#include<bits/stdc++.h>
using namespace std;
int main()
{bitset<8>b("10101100");for(int i=0;i<8;i++)cout<<b[i];cout<<endl; b[2]=0,b[3]=1;cout<<"b[2]:"<<b[2]<<endl;cout<<"b[3]:"<<b[3]<<endl;return 0;} 

在这里插入图片描述

常用方法函数

成员函数功能
set设置指定位或所有位为1(即设置为“已设置”状态)
reset清空指定位或所有位,将其设为0(即设置为“未设置”状态)
flip反转指定位或所有位的状态。如果位是0,则变为1;如果位是1,则变为0
test获取指定位的状态。如果位是1,则返回true;如果位是0,则返回false
count获取被设置为1的位的个数(即“已设置”的位数数量)
size获取位置可以容纳的位的总数。这通常指的是位置数组的最大小(以位为单位)
any如果有任何一个位被设置为1(即至少有一个位是“已设置”状态),则返回true;否则返回false
none如果没有位被设置为1(即所有位都是“未设置”状态),则返回true;否则返回false
all如果所有位都被设置为1(即所有位都是“已设置”状态),则返回true;否则返回false

例题训练

M - 第九届河北省大学生程序设计竞赛

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这道题就巧妙的运用了bitset,非常方便
代码比较详细:

#include<bits/stdc++.h>
#define int long long
using namespace std;
#define endl '\n'
const int N=1005;
int ra,rb,rc,pa,pb,pc,n,m;
string s[N];
void solve()
{cin>>n>>m;for(int i=1;i<=m;i++)cin>>s[i];cin>>ra>>rb>>rc;cin>>pa>>pb>>pc;for(int i=1;i<=(1<<n)-1;i++)//(1<<n)即2的n次方{//在二进制中,2^n的二进制表示的刚好时n+1位数//因为在二进制中2^n次方是1后面跟n个0,所以当2^n用二进制表示时,其位数为n+1bitset<20>bt(i);//将i转化为二进制if(bt.count()>=10&&bt.count()<=13)//题中给了n是10~13道题目,所以可以适当剪枝,减少时间复杂度{vector<int>a;a.push_back(1e18);//维护下标,为了使下标从1开始for(int j=1;j<=m;j++){bitset<20>c(s[j]);//初始化c为01串s[j]c&=bt;//进行且操作,找出两个二进制数中的共同的1的个数a.push_back(c.count());//c.count()表示c中1的个数 } sort(a.begin(),a.end(),greater<int>());//从大到小排序 if(a[ra]==pa&&a[rb]==pb&&a[rc]==pc)// 如果满足题目要求,即当前位次的过题数符合题意{cout<<bt.count()<<endl;//输出一样的个数 for(int j=n-1;j>=0;j--){if(bt[j])//如果为1,输出题目下标 cout<<n-j<<" "; } return ;} } } cout<<-1<<endl;return ;
}
signed main()
{ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);solve();return 0;} 

总结

** 适用场景**
紧凑存储:用极小的内存存储大量布尔值(每位占 1 bit)。

高效位运算:快速实现掩码、集合交集/并集等操作。

状态管理:如权限标志、开关控制等。

优点:类型安全、操作高效、接口直观。
注意:大小需在编译时确定,动态位集需使用 vector 或其他库。

~bitset 是位级操作的利器,尤其适合对性能和内存有严格要求的场景!~

http://www.xdnf.cn/news/719911.html

相关文章:

  • AI和大数据:是工具,还是操控人心的“隐形之手”?
  • Vue模板语法
  • 【大模型学习网络互联】Memory-Mapped I/O MMIO语义与MEM语义
  • 【Elasticsearch】exists` 查询用于判断文档中是否存在某个指定字段。它检查字段是否存在于文档中,并且字段的值不为 `null`
  • 【数据库】数据库的完整性
  • 2024 吉林 CCPC
  • 【25-cv-05855】Keith律所代理Paula Alejandra Navarro 版权图
  • RAG技术:私有大模型知识更新的最佳实践
  • 简述如果要存储用户的密码散列,应该使用什么字段进行存储?
  • 数据的类型——认识你的数据
  • SpringBoot使用MQTT协议简述
  • database disk image is malformed 的解决方法
  • C++ —(详述c++特性)
  • 行锁与表锁详解:原理、区别与面试要点
  • 63、【OS】【Nuttx】任务休眠与唤醒:sleep
  • 系统提示词:Google Stitch
  • 【笔记】suna部署之获取 Daytona API key 及 Daytona Sandbox 设置
  • 在力扣刷题中触摸算法的温度
  • Codeforces Round 1024 (Div. 2)
  • 山东省申报高级职称、正高级职称条件(工业、信息化方向)
  • 大数据如何赋能市场情报分析?——精准决策,从数据开始
  • echarts主题切换实现
  • 多模态融合新方向:光学+AI如何智能分拣,提升塑料回收率?
  • 基于卫星遥感数据识别互花米草及原生植被分布及生长的技术原理、关键方法
  • 利用TOA与最小二乘法直接求解
  • React从基础入门到高级实战:React 生态与工具 - React 国际化(i18n)
  • [学习]C++ 模板探讨(代码示例)
  • Python模块中__all__变量失效问题深度解析
  • 虚幻基础:模型
  • 鲜羊奶对青少年心理健康的 “技术向” 营养支持