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的常见用法的更多相关文章

  1. Guava中Predicate的常见用法

    Guava中Predicate的常见用法 1.  Predicate基本用法 guava提供了许多利用Functions和Predicates来操作Collections的工具,一般在 Iterabl ...

  2. JAVA中enum的常见用法

    JAVA中enum的常见用法包括:定义并添加方法.switch.遍历.EnumSet.EnumMap 1.定义enum并添加或覆盖方法 public Interface Behaviour{ void ...

  3. Java中枚举的常见用法

    在JDK1.5以后引入了一种新的类型,就是枚举(enum).enum是用来声明枚举类型数据,它可以像数组一样存储许多的元素,但是不同于数组的是,它除了数字不能存储以外, 其他类型的如字母.特殊符号.汉 ...

  4. (转)轻松掌握shell编程中数组的常见用法及示例

    缘起:在老男孩进行linux培训shell编程教学中,发现不少水平不错的网友及同学对数组仍然很迷糊,下面就给大家分享下数组的用法小例子,希望能给大家一点帮助.其实SHELL的数组很简单,好用.我们学习 ...

  5. Objective-C中#define的常见用法

    参考博客 http://blog.csdn.net/kindazrael/article/details/8108868 在C语言中,预处理代码是非常强大的工具,能让代码变得可读性和可维护性更强.预处 ...

  6. 转:VC中MessageBox的常见用法

    一.关于MessageBox       消息框是个很常用的控件,属性比较多,本文列出了它的一些常用方法,及指出了它的一些应用场合.       1.MessageBox("这是一个最简单的 ...

  7. VC中MessageBox的常见用法

    一.关于MessageBox       消息框是个很常用的控件,属性比较多,本文列出了它的一些常用方法,及指出了它的一些应用场合.       1.MessageBox("这是一个最简单的 ...

  8. K:java中枚举的常见用法

    用法一:常量   在JDK1.5 之前,我们定义常量都是: public static fianl.....现在好了,有了枚举,可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法. ...

  9. VC++中MessageBox的常见用法详解

    消息框是个很常用的控件,属性比较多,本文列出了它的一些常用方法,及指出了它的一些应用场合.         1.MessageBox("这是一个最简单的消息框!");        ...

  10. Objective-C中Block的常见用法

    typedef int(^AddValue)(int,int); int main(int argc, const char * argv[]) { @autoreleasepool { //1:NS ...

随机推荐

  1. .NET周刊【12月第1期 2024-12-01】

    我在.NET Conf China 2024 等你! .NET Conf China 2024 是一场面向开发人员的社区盛会,旨在庆祝 .NET 9 的发布,并回顾过去一年 .NET 在中国的发展成就 ...

  2. 要构建此项目,必须安装以下工作负载: wasm-tools

    要构建此项目,必须安装以下工作负载: wasm-tools 要安装这些工作负载,请运行以下命令: dotnet workload restore AdminAPP C:\Program Files\d ...

  3. (三)Springboot + vue + 达梦数据库构建RBAC权限模型前后端分离脚手架保姆级教程(前端项目)

    XX后台管理系统 1.技术选型与环境要求 1.1 项目技术选型 1.1.1 前端技术 HTML 5 CSS 3 lavaScript Vue Element UI 1.1.2 后端技术 SpringB ...

  4. 中电金信:GienTech动态|中标、入选、参会...近期精彩呈现!

    中电金信参编业内首个银行核心系统分级度量标准 2024年6月6日,由中国信息通信研究院云计算与大数据研究所主办的"应用现代化赋能银行核心系统升级"交流会议在京召开.会议发布了业内首 ...

  5. okhttp3设置代理(http/https)

    最近项目网络请求需要设置代理,记录一下.http和https都可以. OkHttpClient.Builder builder = new OkHttpClient.Builder(); //代理服务 ...

  6. 【转载】Spring Cloud Gateway排错、调试技巧总结

    http://www.imooc.com/article/290824 本文总结Spring Cloud Gateway的排错.调试技巧.欢迎留言补充! 第一式:Actuator监控端点 借助Actu ...

  7. 龙哥量化:通达信的函数ma均线,ema、sma、dma的计算原理是什么,XMA是未来函数

    注意均线也有未来函数,常见的是跨周期的用法,会导致信号闪烁, 不常见的是XMA这个未来函数太坑了, [代写公式,龙哥微信:Long622889] MA.EMA.SMA.DMA.TMA.WMA6种平均算 ...

  8. Windows交叉编译MNN-3.0.0安卓版本库

    一.写在前面 以下的步骤.流程都是基于MNN的文档,再结合自己的实践得出的,仅作为参考. 博主的环境是windows10专业版 MNN文档 MNN的Github仓库地址 二.下载MNN-3.0.0主库 ...

  9. Linux sudo 提权之软链接攻击

    软链接提权的原理 低权限用户能够以 root 用户的权限执行某个脚本,该脚本中又使用到了诸如 chown 等命令修改文件的权限,且该文件又能够被低权限的用户所修改.因此低权限的用户可以删除该文件,然后 ...

  10. Qt编写项目作品35-数据库综合应用组件

    一.功能特点 同时支持多种数据库比如odbc.sqlite.mysql.postgresql.sqlserver.oracle.人大金仓等. 一个数据库类即可管理本地数据库通信,也支持远程数据库通信等 ...