c++中bitset的常见用法示例详解

 更新时间:2025年02月20日 08:47:25   作者:Tomorrowland_D  
C++ 中的 bitset 是一个用于处理固定大小位序列的模板类,提供高效的位操作功能,这篇文章主要介绍了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的常见用法的文章就介绍到这了,更多相关c++ bitset用法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 关于C++读入数字按位取出与进制转换问题(典型问题)

    关于C++读入数字按位取出与进制转换问题(典型问题)

    这篇文章主要介绍了关于C++读入数字按位取出与进制转换问题,是一个非常典型的问题,本文通过实例举例给大家介绍的非常详细,需要的朋友可以参考下
    2020-02-02
  • VC中BASE64编码和解码使用详解

    VC中BASE64编码和解码使用详解

    Base64是一种很常用的编码方式,利用它可以将任何二进制的字符编码到可打印的64个字符之中, 这样,不管是图片,中文文本等都可以编码成只有ASCII的纯文本。
    2015-11-11
  • 深入解析int(*p)[]和int(**p)[]

    深入解析int(*p)[]和int(**p)[]

    以下是对int(*p)[]和int(**p)[]的使用进行了详细的分析介绍,需要的朋友可以参考下
    2013-07-07
  • 如何写好C main函数的几个注意事项

    如何写好C main函数的几个注意事项

    这篇文章主要介绍了如何写好C main函数的几个注意事项,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-06-06
  • 字符串中找出连续最长的数字字符串的实例代码

    字符串中找出连续最长的数字字符串的实例代码

    这篇文章介绍了字符串中找出连续最长的数字字符串的实例代码,有需要的朋友可以参考一下
    2013-09-09
  • C++11-20 常量表达式的使用

    C++11-20 常量表达式的使用

    本文主要介绍了C++11-20常量表达式,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-10-10
  • C++中字符串查找操作的两则实例分享

    C++中字符串查找操作的两则实例分享

    这篇文章主要介绍了C++中字符串的查找操作的两则实例分享,分别是找到第一个只出现一次的字符以及找出连续最长的数字串的方法,需要的朋友可以参考下
    2016-02-02
  • C++实现幸运大抽奖(QT版)

    C++实现幸运大抽奖(QT版)

    这篇文章主要为大家详细介绍了C++实现幸运大抽奖,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-01-01
  • C++聚合体初始化aggregate initialization详细介绍

    C++聚合体初始化aggregate initialization详细介绍

    这篇文章主要介绍了C++聚合体初始化aggregate initialization,C++有很多初始化对象的方法。其中之一叫做 聚合体初始化(aggregate initialization) ,这是聚合体专有的一种初始化方法
    2023-02-02
  • C++中的整型

    C++中的整型

    这篇文章我们来聊聊C++中的整型,整型即整数,与小数对应。许多语言只能表示一种整型(如Python),而在C++当中根据整数的范围提供了好几种不同的整型,下面文章我们就来看看具体是哪几种,需要的朋友也可以参考一下
    2021-11-11

最新评论