bitset用法详解

发布时间:2023-05-21

一、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 longunsigned 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;
}