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
是一个非常高效且易于使用的工具类。