C++ bitset使用教程

本文介绍了bitset的基本概念,包括定义、初始化、操作等,并探讨了bitset的内部原理及其在实际问题中的应用,通过示例程序展示了如何高效使用bitset解决具体问题。

前言

话说昨天考试有一道题目,可以用bitset艹过去
可是LZ并不会啊……于是只好打暴力……
结果可想而知……
于是LZ下定决心一定要把bitset学透
然后……就有了这篇blog

bitset定义与初始化

bitset是STL提供的用于记录01串的容器
也就是bitset的每个元素只能为0/1

用bitset之前别忘了:

#include<bitset>

以下是正确的定义方式:

bitset<16> a;  //第0~15位都是0
bitset<6> b(string("010010"));  //用字符串初始化b
bitset<32> c(0x80000000);  //第0位是1,其他都是0

注意bitset声明后长度不可改变
和数组一样,bitset从0开始编号

bitset的操作

以下是bitset常用操作:

a.any()  //a中是否含1
a.none()  //a是否全为0
a.count()  //a中有几个1
a.[pos]  //访问第pos位
a.test(pos)  //第pos位是否为1
a.set()  //全部设为1
a.reset()  //全部清零
a.flip()  //全部取反
a.to_ulong()  //转成32位无符号整数

或者也可以对bitset使用位操作(返回一个bitset):

a|b
a&b
a^b
~a
a<<1
a>>1

这些都和整数的位操作类似,这里不做解释

bitset的原理

相信大家都打过高精度吧
bitset的原理与高精度压位类似

即:将一个很长的01串按64位一组划分
每组01串用一个64位无符号整数记录

bitset所有的操作都是基于对整数的位操作实现的。
所以bitset的效率非常高,可以看作 O(N/64)

bitset的应用

由于bitset的高效率并且易于使用
所以一般用于各种暴力骗分(见前言)
但是,如果真的想要多拿一些分,可以考虑手写bitset,这样常数比较小

例题

POJ2443

示例程序:

#include<cstdio>
#include<bitset>
using namespace std;
#define nc getchar
int n,q;
bitset<1002> S[10002];
inline int red(){
    int res=0,f=1;char ch=nc();
    while (ch<'0'||'9'<ch) {if (ch=='-') f=-f;ch=nc();}
    while ('0'<=ch&&ch<='9') res=res*10+ch-48,ch=nc();
    return res*f;
}
int main(){
    n=red();
    for (int i=1;i<=n;i++)
     for (int j=1,k=red();j<=k;j++)
      S[red()].set(i);
    q=red();
    while (q--){
        int i=red(),j=red();
        if ((S[i]&S[j]).any()) printf("Yes\n");else printf("No\n");
    }
    return 0;
}
<think>好的,用户想了解C++bitset使用教程。我需要先回忆一下bitset的基本概念和常用方法。首先,bitset是用来处理二进制位的,可以方便地进行位操作。然后需要涵盖如何初始化bitset,比如直接定义、用字符串或数值初始化。接下来是常用的成员函数,比如set、reset、flip、test等,这些函数的功能和用法需要详细说明。另外,还要提到运算符的使用,比如位运算和输入输出操作。然后,可能还需要一些示例代码来帮助用户理解。要注意用户提供的引用资料,引用[3]提到了初始化的方法,引用[1]、[2]、[4]提到了any()、to_string()、reset()函数,这些都需要包含在回答中。还要检查是否有其他重要的函数或特性被遗漏,比如大小固定的特性、转换函数等。需要确保回答结构清晰,分点说明,每个部分有对应的代码示例。最后生成相关问题,可能涉及应用场景、性能、转换方法等。同时,要遵循用户给出的格式要求,行内公式用$...$,独立公式用$$...$$,虽然这个问题可能涉及数学公式不多,但如果有的话要注意格式。最后确认引用标注正确,参考提供的引用资料中的信息,但用户给的引用似乎有些不太相关,可能需要调整,不过根据用户要求还是需要添加引用标识。现在组织内容,确保覆盖所有重要知识点,代码示例正确,语法正确,使用中文回答。</think>### C++ bitset 使用教程 `bitset` 是 C++ 标准库中用于处理二进制位的高效容器类,支持位操作、转换和查询等功能。以下是其核心用法: --- #### 1. **基本定义与初始化** - **固定大小定义**:`bitset<N>` 表示一个包含 `N` 位的二进制序列。 ```cpp bitset<8> a; // 默认全0:00000000 bitset<16> b(0xFFFF); // 用十六进制初始化:1111111111111111 bitset<4> c(string("1010")); // 用字符串初始化:1010 [^3] ``` --- #### 2. **常用成员函数** - **设置/重置位**: ```cpp b.set(3); // 将第3位设为1(索引从0开始) b.reset(2); // 将第2位设为0 [^4] b.flip(); // 翻转所有位 ``` - **查询与统计**: ```cpp bool hasOne = b.any(); // 检查是否有至少一个1 [^1] int count = b.count(); // 统计1的个数 bool isSet = b.test(3); // 检查第3位是否为1 ``` - **转换函数**: ```cpp string s = b.to_string(); // 转为字符串,如"1010" [^2] unsigned long num = b.to_ulong(); // 转为无符号整数 ``` --- #### 3. **运算符支持** - **位运算**:直接使用 `&`, `|`, `^`, `~`, `<<`, `>>` 操作。 ```cpp bitset<4> x("1100"); bitset<4> y("1010"); auto result = x & y; // 1000 ``` - **输入输出**: ```cpp bitset<4> d; cin >> d; // 输入二进制序列(如1100) cout << d; // 输出二进制形式 ``` --- #### 4. **应用示例** ```cpp #include <iostream> #include <bitset> using namespace std; int main() { bitset<8> flags(0b10101010); // 二进制初始化 flags.set(0); // 设置第0位为1 flags.flip(4); // 翻转第4位 cout << "Flags: " << flags << endl; // 输出结果 return 0; } ``` ---
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值