c++中bitset的常见用法
C++ 中的 bitset 是一个用于处理固定大小位序列的模板类,提供高效的位操作功能。以下是对其关键特性的详细介绍:
1. 声明与初始化
- 头文件:需包含
<bitset>。 - 声明:
bitset<N>表示一个包含N位的二进制集合(N为编译时常量)。bitset<8> b1; // 默认初始化,所有位为0
bitset<4> b2(5); // 用整数初始化:0101
bitset<4> b3("1010"); // 用字符串初始化:1010
bitset<4> b4(b3); // 拷贝构造
2. 初始化规则
- 整数初始化:高位截断,低位对齐。
bitset<3> b(10); // 10的二进制为1010 → 截断为010(值为2)
- 字符串初始化:
- 字符串只能包含
'0'和'1'。 - 默认从字符串的 左端(高位) 开始解析。
bitset<4> b("1010"); // 高位 → 低位:1 0 1 0 → 十进制10
bitset<4> b("101010", 2, 4); // 从索引2取4位:"1010" → 值为10
- 字符串只能包含
3. 常用操作
位访问:
[]运算符:通过索引访问(从右到左,0为最低位)。test(pos):检查指定位是否为1,越界抛出异常。
bitset<4> b("1010");
bool bit0 = b[0]; // 0 → 最低位
bool bit3 = b[3]; // 1 → 最高位
修改位:
set(pos, val):设置某位(默认1)。reset(pos):清除某位(设为0)。flip(pos):翻转某位。
b.set(0); // 1010 → 1011
b.reset(3); // 1011 → 0011
b.flip(1); // 0011 → 0001
统计与判断:
count():返回1的个数。any()/none()/all():判断是否存在/没有/全部为1。
if (b.any()) cout << "至少1位为1";
4. 位运算
- 支持
&、|、^、~、<<、>>等运算符(长度需相同):bitset<4> a("1010"), b("1100");
auto c = a & b; // 1000
auto d = a << 1; // 0100
5. 类型转换
to_ulong()/to_ullong():转为无符号整数(可能溢出)。to_string():转为字符串,可指定填充字符。bitset<4> b(10);
string s = b.to_string(); // "1010"
6. 应用场景
- 位标志管理:如权限控制、状态标记。
- 位掩码操作:快速筛选或修改特定位。
- 数据压缩:高效存储布尔值。
示例代码
#include <bitset>
#include <iostream>
using namespace std;
int main() {
bitset<8> b1(42); // 00101010
bitset<8> b2("10101010"); // 10101010
cout << b1 << endl; // 输出 00101010
b1.set(0); // 变为 00101011
b2.flip(); // 变为 01010101
cout << (b1 & b2) << endl; // 00000001
cout << b1.to_ulong() << endl; // 43
return 0;
}
注意事项
- 越界访问:
test(pos)会检查越界,[]不会。 - 性能:位操作高效,适合密集运算。
- 字符串顺序:字符串的第一个字符对应高位。
bitset 是处理二进制数据的利器,结合明确的位序规则和丰富的接口,可显著简化位级操作代码。
c++中bitset的常见用法的更多相关文章
- Guava中Predicate的常见用法
Guava中Predicate的常见用法 1. Predicate基本用法 guava提供了许多利用Functions和Predicates来操作Collections的工具,一般在 Iterabl ...
- JAVA中enum的常见用法
JAVA中enum的常见用法包括:定义并添加方法.switch.遍历.EnumSet.EnumMap 1.定义enum并添加或覆盖方法 public Interface Behaviour{ void ...
- Java中枚举的常见用法
在JDK1.5以后引入了一种新的类型,就是枚举(enum).enum是用来声明枚举类型数据,它可以像数组一样存储许多的元素,但是不同于数组的是,它除了数字不能存储以外, 其他类型的如字母.特殊符号.汉 ...
- (转)轻松掌握shell编程中数组的常见用法及示例
缘起:在老男孩进行linux培训shell编程教学中,发现不少水平不错的网友及同学对数组仍然很迷糊,下面就给大家分享下数组的用法小例子,希望能给大家一点帮助.其实SHELL的数组很简单,好用.我们学习 ...
- Objective-C中#define的常见用法
参考博客 http://blog.csdn.net/kindazrael/article/details/8108868 在C语言中,预处理代码是非常强大的工具,能让代码变得可读性和可维护性更强.预处 ...
- 转:VC中MessageBox的常见用法
一.关于MessageBox 消息框是个很常用的控件,属性比较多,本文列出了它的一些常用方法,及指出了它的一些应用场合. 1.MessageBox("这是一个最简单的 ...
- VC中MessageBox的常见用法
一.关于MessageBox 消息框是个很常用的控件,属性比较多,本文列出了它的一些常用方法,及指出了它的一些应用场合. 1.MessageBox("这是一个最简单的 ...
- K:java中枚举的常见用法
用法一:常量 在JDK1.5 之前,我们定义常量都是: public static fianl.....现在好了,有了枚举,可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法. ...
- VC++中MessageBox的常见用法详解
消息框是个很常用的控件,属性比较多,本文列出了它的一些常用方法,及指出了它的一些应用场合. 1.MessageBox("这是一个最简单的消息框!"); ...
- Objective-C中Block的常见用法
typedef int(^AddValue)(int,int); int main(int argc, const char * argv[]) { @autoreleasepool { //1:NS ...
随机推荐
- 题解:AT_abc382_c [ABC382C] Kaiten Sushi
题目传送门 思路 首先看一下数据范围. \(1 \leq N, M \leq 2 \times 10^5\) \(1 \leq A_i, B_i \leq 2 \times 10^5\) 这么大的数据 ...
- Fiddler模拟网络超时
前情 最近在优化接口请求错误的报错提示,希望尽可能的能从提示语知道当前错误大致原因,于是我需要模拟各种错误请求的状况. 问题 网络超时是很常见的接口请求错误情况,在没有服务端配合的情况下,我需要怎样来 ...
- 树莓派4B 关闭休眠,关闭屏保
1.安装 sudo apt install xscreensaver 2.打开xscreensaver sudo xscreensaver-demo 3.设置 参考:https://zhuanlan. ...
- Flutter null safety 无法运行
Flutter空安全问题 在pub上有一些库导入之后无法运行,这是因为健全的空安全 解决方法 1.在命令行中添加参数 flutter run --no-sound-null-safety 2.在IDE ...
- WinDbg: Failed to find runtime module (coreclr.dll or clr.dll or libcoreclr.so)
当我们通过 WinDbg 启动一个 .NET 的程序时,WinDbg 将会在运行可执行之前执行一个中断,此时还没有加载 .NET 的运行时. 但是,SOS 扩展需要 clr.dll 或者 corecl ...
- .NET 服务发现
.NET 服务发现 https://learn.microsoft.com/en-us/dotnet/core/extensions/service-discovery?tabs=dotnet-cli ...
- SpringSecurity认证流程分析
重要组件 SecurityContext 上下文对象,Authentication(认证)对象会放在里面 SecurityContextHolder 用于拿到上下文对象的静态工具类 Authentic ...
- Docker 使用 buildx 构建多种系统架构支持的镜像
在 Docker 19.03+ 版本中可以使用 docker buildx build 命令使用 BuildKit 构建镜像.该命令支持 --platform 参数可以同时构建支持多种系统架构的 Do ...
- Http2服务调用排坑记
原文作者:陈友行原文链接:https://www.nginx.org.cn/article/detail/89转载来源:NGINX开源社区著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明 ...
- Qt编写安防视频监控系统57-子模块1设备列表
一.前言 近期在经历过这次UI大重构以后,很多拆分的功能都以单独的模块的形式出现,以悬停窗体的形式嵌入或者悬浮在主窗体中,这种方式极大的增强了系统的拓展性,客户想要什么模块就开启什么模块,放置到合适的 ...