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