一、bitset简介
bitset是C++ STL库中的一个类,用于存储二进制位的布尔值,提供了简单的位操作函数。bitset对象可以控制每个位的值为0或1。可以看做是一种高效的位图。
#include<bitset>
using namespace std;
二、bitset的常规用法
1、创建bitset变量
创建一个bitset变量,参数表示变量长度,即二进制位数。默认构造函数构造的bitset变量所有位的值都是0。通过构造函数bitset(int n, unsigned long value)
可以构造一个值为value
的n位bitset对象。
bitset<8> bits; //创建一个长度为8的bitset对象,所有位初始值都为0
bitset<8> bits1(0b10101010); //创建一个长度为8的bitset对象,数值为0b10101010
2、访问bitset变量
使用[]
运算符或者字符串形式的下标来访问bitset变量的对应位,如bits[2]
或bits["010"]
表示访问第3位,下标从0开始。
bitset<8> bits(0b10101010);
cout << bits[0] << " " << bits[2] << " " << bits[7] << endl;
// 输出 0 1 0
3、bitset变量输入输出
bitset变量可以通过iostream库中的输入输出函数使用,bitset对象可以用作输出流和输入流。
bitset<8> bits(0b10101010);
cout << bits << endl; // 输出10101010
cin >> bits; // 输入一个二进制数到bits
4、bitset变量设置和清除
使用set()
方法可以将某一位设置为1,reset()
方法可以将某一位设置为0。
bitset<8> bits;
bits.set(2); //将第3位设置为1
bits.reset(1); //将第2位设置为0
5、bitset变量的位运算
bitset对象提供了基本的位运算函数,包括按位与、按位或、按位异或、按位取反。可以使用与、或、异或、取反运算符或者对应的成员函数进行位运算。
bitset<8> a(0b11001100);
bitset<8> b(0b10101010);
bitset<8> c = a & b; //按位与
bitset<8> d = a | b; //按位或
bitset<8> e = a ^ b; //按位异或
bitset<8> f = ~a; //按位取反
三、bitset的高级用法
1、bitset对象的大小控制
使用size()
方法可以获取bitset对象的位数,max_size()
方法可以获取bitset对象所能包含的最大位数。使用count()
方法可以获取bitset中1的数量,flip()
方法可以将所有位取反。
bitset<8> bits(0b10101010);
cout << bits.size() << endl; // 输出8,bits对象包含8个二进制位
cout << bits.count() << endl; // 输出4,bits对象中1的数量为4
bits.flip(); // 将所有位取反
2、bitset对象的截取和连接
使用to_ulong()
和to_ullong()
方法可以将bitset对象转换为unsigned long
和unsigned long long
类型。使用to_string()
方法可以将bitset对象转化为string
类型。使用operator<<
和operator>>
可以将bitset对象截取或连接。两个bitset对象可以拼接成一个较长的对象。
bitset<4> a(0b1010);
bitset<8> b(0b11110000);
unsigned long c = a.to_ulong();
cout << c << endl; // 输出10,将a转换为unsigned long类型
string d = a.to_string();
cout << d << endl; // 输出“1010”,将a转换为string类型
bitset<12> e = (a << 8) | b;
cout << e << endl; // 输出“101011110000” 用a左移8位的结果与b拼接成一个12位的bitset对象
四、bitset的应用
bitset可以用于大量的位运算问题,如压位DP、游戏中的状态存储、压缩算法、密码学等方面。
代码示例
#include<bitset>
#include <iostream>
using namespace std;
int main() {
//常规用法
bitset<8> bits; //创建一个长度为8的bitset对象,所有位初始值都为0
bitset<8> bits1(0b10101010); //创建一个长度为8的bitset对象,数值为0b10101010
cout << bits1[0] << " " << bits1[2] << " " << bits1[7] << endl;
// 输出 0 1 0
bitset<8> bits2(0b10101010);
cout << bits2 << endl; // 输出10101010
cin >> bits2; //输入一个二进制数到bits2
bitset<8> bits3(0b10101010);
bits3.set(2); //将第3位设置为1
bits3.reset(1); //将第2位设置为0
cout << bits3 << endl; // 输出10101100
bitset<8> a(0b11001100);
bitset<8> b(0b10101010);
bitset<8> c = a & b; //按位与
bitset<8> d = a | b; //按位或
bitset<8> e = a ^ b; //按位异或
bitset<8> f = ~a; //按位取反
cout << c << " " << d << " " << e << " " << f << endl;
// 输出“10001000 11101110 01100110 00110011”
//高级用法
bitset<8> bits4(0b10101010);
cout << bits4.size() << endl; // 输出8,bits对象包含8个二进制位
cout << bits4.count() << endl; // 输出4,bits对象中1的数量为4
bits4.flip(); // 将所有位取反
cout << bits4 << endl; // 输出“01010101”
bitset<4> a1(0b1010);
bitset<8> b1(0b11110000);
unsigned long c1 = a1.to_ulong();
cout << c1 << endl; // 输出10,将a1转换为unsigned long类型
string d1 = a1.to_string();
cout << d1 << endl; // 输出“1010”,将a1转换为string类型
bitset<12> e1 = (a1 << 8) | b1;
cout << e1 << endl; // 输出“101011110000” 用a1左移8位的结果与b1拼接成一个12位的bitset对象
return 0;
}