当前位置: 首页 > article >正文

C++ `bitset` 入门指南

在 C++ 中,bitset 是标准库提供的一个非常有用的工具类,能够高效地处理和操作位数据。它提供了一个固定大小的位集合,适用于处理布尔数据、标志集合、位图等问题。bitset 提供了丰富的操作和方法来访问、修改、设置和清除位,以及进行位运算和位移等操作。

本篇文章将为您介绍 C++ bitset 的基础用法,涵盖如何初始化、访问和修改 bitset 中的位,以及如何使用 bitset 进行常见的位运算。


1. bitset 基本使用

1.1 初始化 bitset

bitset 的大小是固定的,可以在声明时指定。它可以通过整数值或二进制字符串进行初始化。

#include <bitset>
#include <iostream>

int main() {
    std::bitset<8> b1;           // 默认初始化,所有位都为 0
    std::bitset<8> b2(42);       // 用整数初始化 (42的二进制:00101010)
    std::bitset<8> b3("101010"); // 用二进制字符串初始化
    
    std::cout << "b1: " << b1 << std::endl;
    std::cout << "b2: " << b2 << std::endl;
    std::cout << "b3: " << b3 << std::endl;

    return 0;
}

输出:

b1: 00000000
b2: 00101010
b3: 10101000
1.2 访问和操作 bitset 中的位

bitset 提供了一些方法来设置、重置、反转和访问特定位置的位。

#include <bitset>
#include <iostream>

int main() {
    std::bitset<8> b(42);  // 00101010

    std::cout << "Bit at position 0: " << b[0] << std::endl;  // 输出 0
    std::cout << "Bit at position 1: " << b[1] << std::endl;  // 输出 1
    std::cout << "Size of bitset: " << b.size() << std::endl; // 输出 8

    b.set(0);  // 设置位置 0 的位为 1
    b.reset(1);  // 将位置 1 的位重置为 0
    b.flip(2);  // 反转位置 2 的位

    std::cout << "Modified bitset: " << b << std::endl; // 输出 00100111

    return 0;
}

输出:

Bit at position 0: 0
Bit at position 1: 1
Size of bitset: 8
Modified bitset: 00100111
1.3 常用方法
  • set(pos): 将位 pos 设置为 1。
  • reset(pos): 将位 pos 设置为 0。
  • flip(pos): 反转位 pos,即 0 变为 1,1 变为 0。
  • to_string(): 将 bitset 转换为二进制字符串。
  • count(): 返回 bitset 中 1 的位数。
  • any(): 检查 bitset 是否有任意一个 1 位。
  • none(): 检查 bitset 是否没有 1 位。
  • size(): 获取 bitset 的位数。

2. bitset 位运算

除了对单个位进行操作,bitset 还支持多种 位运算,包括按位与、按位或、按位异或、按位取反以及位移操作。以下是 bitset 中常见的位运算操作及其示例。

2.1 按位与(AND)&

按位与操作用于两个 bitset 中的对应位进行 AND 操作,只有当两个位都为 1 时,结果位才为 1,否则为 0。

#include <bitset>
#include <iostream>

int main() {
    std::bitset<8> b1(42);  // 00101010
    std::bitset<8> b2(15);  // 00001111

    std::bitset<8> and_result = b1 & b2;
    std::cout << "b1 & b2: " << and_result << std::endl;  // 输出 00001010

    return 0;
}

输出:

b1 & b2: 00001010
2.2 按位或(OR)|

按位或操作用于两个 bitset 中的对应位进行 OR 操作,只要两个位中有一个为 1,结果位就为 1。

#include <bitset>
#include <iostream>

int main() {
    std::bitset<8> b1(42);  // 00101010
    std::bitset<8> b2(15);  // 00001111

    std::bitset<8> or_result = b1 | b2;
    std::cout << "b1 | b2: " << or_result << std::endl;  // 输出 00101111

    return 0;
}

输出:

b1 | b2: 00101111
2.3 按位异或(XOR)^

按位异或操作用于两个 bitset 中的对应位进行 XOR 操作,当两个位不相同时,结果位为 1。

#include <bitset>
#include <iostream>

int main() {
    std::bitset<8> b1(42);  // 00101010
    std::bitset<8> b2(15);  // 00001111

    std::bitset<8> xor_result = b1 ^ b2;
    std::cout << "b1 ^ b2: " << xor_result << std::endl;  // 输出 00100101

    return 0;
}

输出:

b1 ^ b2: 00100101
2.4 按位取反(NOT)~

按位取反操作用于反转 bitset 中的所有位,0 变为 1,1 变为 0。

#include <bitset>
#include <iostream>

int main() {
    std::bitset<8> b(42);  // 00101010

    std::bitset<8> not_result = ~b;
    std::cout << "~b: " << not_result << std::endl;      // 输出 11010101

    return 0;
}

输出:

~b: 11010101
2.5 位移操作(<<>>

bitset 还支持位移操作。左移 (<<) 将 bitset 中的所有位向左移动指定的位数,空出的低位用 0 填充。右移 (>>) 将 bitset 中的所有位向右移动指定的位数,空出的高位用 0 填充。

#include <bitset>
#include <iostream>

int main() {
    std::bitset<8> b(42);  // 00101010

    std::bitset<8> left_shift = b << 2;  // 左移2位
    std::cout << "b << 2: " << left_shift << std::endl;  // 输出 10100000

    std::bitset<8> right_shift = b >> 2;  // 右移2位
    std::cout << "b >> 2: " << right_shift << std::endl; // 输出 00001010

    return 0;
}

输出:

b << 2: 10100000
b >> 2: 00001010

小结

  • bitset 提供了对位的灵活操作,适用于处理位数据。
  • 通过 bitset 可以高效地进行 位运算(按位与、按位或、按位异或、按位取反)和 位移操作,这些操作广泛应用于算法、数据压缩、图像处理、加密等场景。
  • bitset 通过提供丰富的成员函数和运算符,极大地简化了位操作的使用,并使得代码更加简洁和高效。

在 C++ 中,如果你需要对大量的布尔数据进行操作,bitset 是一个非常高效且易于使用的工具类。


http://www.kler.cn/a/576532.html

相关文章:

  • 蓝桥杯P17153-班级活动 题解
  • Elastic如何获取当前系统时间
  • 【算法方法总结·四】字符串操作的一些技巧和注意事项
  • Chrome 扩展开发:Chrome 扩展的作用和开发意义(一)
  • Ollama 框架本地部署教程:开源定制,为AI 项目打造专属解决方案!
  • 网络与网络安全
  • 每天记录一道Java面试题---day28
  • 3.6 登录认证
  • el-table一格两行;概率;find
  • 面向服务的架构风格
  • P63 C++当中的计时
  • Vim复制内容到系统剪切板
  • 深入HarmonyOS NEXT开发中的ArkData操作SQLite数据库
  • 如何收集 Kubernetes 集群的日志
  • 在 k8s中查看最大 CPU 和内存的极限
  • Vue-flow中动态流程图的实现
  • C++学习——栈(一)
  • 江科大51单片机笔记【9】DS1302时钟可调时钟(下)
  • 基于 uni-app 和 Vue3 开发的汉字书写练习应用
  • c语言程序设计--数组里面考察最多的一个知识点-考研冲刺复试面试问答题。