目录

  1. 概述
  2. 基本特性
  3. 基本用法
  1. <vector<bool>> 的对比
  2. 注意事项
  3. 实用示例:权限管理
  4. 小练习
  1. 参考资料
  2. 出站链接

概述

<bitset> 是 C++ 标准库中的容器类,用于表示固定大小的二进制位序列。它以位为单位存储数据,提供高效的位操作接口。<bitset> 的容量在编译时确定,不能动态调整。

包含头文件

#include <bitset>
#include <iostream>

定义格式

std::bitset<位数> 变量名;
  • 位数:模板参数,指定位数组的大小,必须是编译时常量(如 832)。

基本特性

  • 固定大小:大小在编译时确定,无法运行时改变。
  • 高效位操作:支持按位与、或、异或、移位等操作。
  • 紧凑存储:每个位占用 1 bit,内存效率高。
  • 无迭代器:不支持 STL 风格的迭代器。

基本用法

声明和初始化

#include <bitset>
#include <iostream>

int main() {
    std::bitset<8> b1;              // 8 位全 0:00000000
    std::bitset<8> b2(5);           // 从整数初始化:00000101
    std::bitset<8> b3("1010");      // 从字符串初始化:00001010

    std::cout << "b1: " << b1 << std::endl; // 输出:00000000
    std::cout << "b2: " << b2 << std::endl; // 输出:00000101
    std::cout << "b3: " << b3 << std::endl; // 输出:00001010
    return 0;
}

访问和修改位

#include <bitset>
#include <iostream>

int main() {
    std::bitset<4> b(3); // 初始化为 0011
    std::cout << "Original: " << b << std::endl;

    b[0] = 0;      // 修改第 0 位
    b.set(2);      // 将第 2 位设为 1
    b.reset(1);    // 将第 1 位设为 0
    b.flip(3);     // 翻转第 3 位

    std::cout << "Modified: " << b << std::endl; // 输出:0100
    std::cout << "Bit 2: " << b[2] << std::endl; // 输出:1
    return 0;
}
  • []:访问或修改某位。
  • set(pos):将某位置 1。
  • reset(pos):将某位置 0。
  • flip(pos):翻转某位。

位操作

#include <bitset>
#include <iostream>

int main() {
    std::bitset<4> b1(5); // 0101
    std::bitset<4> b2(3); // 0011

    std::cout << "b1 & b2: " << (b1 & b2) << std::endl; // 输出:0001 (按位与)
    std::cout << "b1 | b2: " << (b1 | b2) << std::endl; // 输出:0111 (按位或)
    std::cout << "b1 ^ b2: " << (b1 ^ b2) << std::endl; // 输出:0110 (按位异或)
    std::cout << "~b1: " << (~b1) << std::endl;         // 输出:1010 (按位取反)
    std::cout << "b1 << 1: " << (b1 << 1) << std::endl; // 输出:1010 (左移)
    std::cout << "b1 >> 1: " << (b1 >> 1) << std::endl; // 输出:0010 (右移)
    return 0;
}

查询和统计

#include <bitset>
#include <iostream>

int main() {
    std::bitset<8> b("10100110");
    std::cout << "b: " << b << std::endl;
    std::cout << "Count of 1s: " << b.count() << std::endl;     // 输出:4
    std::cout << "All 1s? " << b.all() << std::endl;            // 输出:0
    std::cout << "Any 1s? " << b.any() << std::endl;            // 输出:1
    std::cout << "No 1s? " << b.none() << std::endl;            // 输出:0
    std::cout << "Test bit 2: " << b.test(2) << std::endl;      // 输出:1
    return 0;
}
  • count():统计 1 的个数。
  • all():检查是否全为 1。
  • any():检查是否有 1。
  • none():检查是否全为 0。
  • test(pos):检查某位是否为 1。

转换为其他类型

#include <bitset>
#include <iostream>

int main() {
    std::bitset<8> b("1010"); // 00001010
    std::cout << "As integer: " << b.to_ulong() << std::endl; // 输出:10
    std::cout << "As string: " << b.to_string() << std::endl; // 输出:00001010
    return 0;
}
  • to_ulong():转换为无符号长整数。
  • to_string():转换为二进制字符串。

大小和状态

#include <bitset>
#include <iostream>

int main() {
    std::bitset<8> b;
    std::cout << "Size: " << b.size() << std::endl; // 输出:8
    return 0;
}
  • size():返回位数(编译时常量)。
  • empty(),因大小固定。

<vector<bool>> 的对比

特性std::bitsetstd::vector<bool>
大小固定(编译时)动态(运行时)
内存效率每位 1 bit每位 1 bit(优化)
位操作丰富(与、或等)有限
迭代器不支持支持
动态调整不支持支持

注意事项

  1. 固定大小:无法动态调整,若需动态大小,使用 <vector<bool>>
  2. 越界访问[]test() 在越界时抛出 std::out_of_range
  3. 性能:位操作高效,但不适合需要迭代的场景。
  4. 整数范围to_ulong() 若超出范围抛出 std::overflow_error

实用示例:权限管理

#include <bitset>
#include <iostream>

enum Permission {
    READ = 0,
    WRITE = 1,
    EXECUTE = 2
};

int main() {
    std::bitset<3> perms; // 3 种权限
    perms.set(READ);      // 授予读权限
    perms.set(EXECUTE);   // 授予执行权限

    std::cout << "Permissions: " << perms << std::endl; // 输出:101
    if (perms.test(READ)) {
        std::cout << "Has read permission" << std::endl;
    }
    if (!perms.test(WRITE)) {
        std::cout << "No write permission" << std::endl;
    }
    return 0;
}

输出:

Permissions: 101
Has read permission
No write permission

小练习

问题

写一个 C++ 程序:

  1. 定义一个 std::bitset<8>,初始化为二进制 “10101010”。
  2. 翻转第 3 位。
  3. 将第 5 位置为 0。
  4. 输出最终位序列和 1 的个数。

参考答案

#include <bitset>
#include <iostream>

int main() {
    std::bitset<8> b("10101010"); // 初始化为 10101010
    b.flip(3);                    // 翻转第 3 位:10111010
    b.reset(5);                   // 将第 5 位置 0:10011010

    std::cout << "Final bits: " << b << std::endl;       // 输出:10011010
    std::cout << "Count of 1s: " << b.count() << std::endl; // 输出:5
    return 0;
}

参考资料

  1. C++ Standard Library Reference: <bitset> 的官方文档。
  • ISO/IEC 14882:2011 (C++11 Standard)
  1. cppreference.com: 提供 <bitset> 的详细说明和示例。
  2. The C++ Programming Language (4th Edition) by Bjarne Stroustrup: C++ 容器权威书籍。
  3. Effective STL by Scott Meyers: STL 容器实用建议。

出站链接


下一步

  • 如果你想试试练习,请提交代码,我会帮你检查。
  • 如果需要更深入内容(如位运算优化、与 <dynamic_bitset> 对比),或设计测验题,请告诉我!
  • 你也可以提出具体问题,如“如何用 <bitset> 实现布隆过滤器?”或“<bitset> 的内存布局?”。

现在,你想做什么?试试练习,还是有其他需求?