您的位置:

bitset用法详解

一、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<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位设置为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<<
        

         

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<
                              
                              <