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. 销讯通-CRM系统的功能远远不止于用来打卡

    在信息化的过程中,CRM系统其实很多企业都在用,最开始的设想是很好的,大家用着之后发现它可能最终只会沦为一个上班打卡考核或者是最基础的一个签到工具了,没有发挥它应有的一个功能. 最基础的一个诉求 我们 ...

  2. Prometheus 3.0.0 升级中遇到的 `--storage.tsdb.retention` 错误的修复方法

    在将 Prometheus 升级到 3.0.0 后,许多用户会遇到以下错误: Error parsing command line arguments: unknown long flag '--st ...

  3. git clone 指定 ssh-key 文件

    环境 & 软件 mac OS 问题 git clone 不是默认 ssh-key,无法克隆 解决方法 用ssh-add命令将对应的私钥加入到缓存 // ssh-add 自定义名称 // 例子 ...

  4. UDP与TCP+JAVA相关理论

    相关知识 目录 相关知识 UDP UDP认识 UDP的特点(与TCP相比) UDP网络Socket编程(Java实现) 1.创建客户端 2.客户端图形界面 TCP Socket编程通信 JAVA 基础 ...

  5. [转]为什么VS提示SurfFeatureDetector不是cv的成员函数

    surf和sift算法都是在头文件#include <opencv2/features2d/features2d.hpp>中,但在新的opencv版本出来后,如果仍然使用这个头文件就会出现 ...

  6. 优化博客Ⅱ-CDN加速

    CDN加速 自从有了第一次博客优化经验,我就越发对优化感兴趣了嘿嘿(✧∇✧). 看着博客首页打开时长为1200ms左右,我又开始琢磨有什么办法能再给网站提提速,让访问时间降低到1000ms以下,这时候 ...

  7. 树莓派Zero OLED屏幕转接板

    买了个树莓派Zero,emmm,拿到手后感觉很精巧,但是总是感觉少了什么.于是... 瞎吹一波:不得不说嘉立创公司确实给力,一条龙服务而且价格太便宜了. 焊接组装上机测试,OK! 其实这个过程中坑也踩 ...

  8. nginx 简单实践:静态资源部署、URL 重写【nginx 实践系列之一】

    〇.前言 本文为 nginx 简单实践系列文章之一,主要简单实践了两个内容:静态资源部署.重写,仅供参考. 关于 Nginx 基础,以及安装和配置详解,可以参考博主过往文章: https://www. ...

  9. CSS JS 自适应菜单

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. c# set Webbowser version with WPF/Winform app

    <Window x:Class="TestWPF.MainWindow" xmlns="http://schemas.microsoft.com/winfx/200 ...