一、bitset简介
bitset是C++ STL库中的一个类,用于存储二进制位的布尔值,提供了简单的位操作函数。bitset对象可以控制每个位的值为0或1。可以看做是一种高效的位图。
#includeusing 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<<<" "< <<" "< < 3、bitset变量输入输出
bitset变量可以通过iostream库中的输入输出函数使用,bitset对象可以用作输出流和输入流。
bitset<8> bits(0b10101010); cout<< >bits; //输入一个二进制数到bits 4、bitset变量设置和清除
使用set()方法可以将某一位设置为1,reset()方法可以将某一位设置为0。
bitset<8> bits; bits.set(2); //将第3位设置为1 bits.reset(1); //将第2位设置为05、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<< 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<< e = (a<<8) | b; cout< < 四、bitset的应用
bitset可以用于大量的位运算问题,如压位DP、游戏中的状态存储、压缩算法、密码学等方面。
代码示例
#include#include using namespace std; int main() { //常规用法 bitset<8> bits; //创建一个长度为8的bitset对象,所有位初始值都为0 bitset<8> bits1(0b10101010); //创建一个长度为8的bitset对象,数值为0b10101010 cout< <<" "< <<" "< < bits2(0b10101010); cout< < >bits2; //输入一个二进制数到bits2 bitset<8> bits3(0b10101010); bits3.set(2); //将第3位设置为1 bits3.reset(1); //将第2位设置为0 cout< < 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< <<" "< <<" "< <<" "< < bits4(0b10101010); cout< < a1(0b1010); bitset<8> b1(0b11110000); unsigned long c1 = a1.to_ulong(); cout< < e1 = (a1<<8) | b1; cout< <