bitset——定义及常用操作。

前言:今天碰见了这个操作,发现在状态压缩的时候特别好用,就整理一下吧。


bitset 就相当于一个 只能存储二进制,也就是 0 和 1 的 bool 数组
但是可以直接当作一个数进行左移右移,取或取反等二进制操作

如果直接用 bool 数组存储二进制每一位的话,n 位存储复杂度为 O(n),但是用 bitset 的话复杂度会减少到 O(n/32)。

所以一般用二进制状态压缩时就会用 bitset


一、定义:

对于 bitset 的定义有四种方式:
1、直接定义,每一位初始为0:
bitset<N> name; // 定义长度为 N 的二进制数组,命名为 name;

bitset<8> b1;
cout << b1 <<endl;

2、存储数字的二进制:
bitset<N> name(num); // 定义长度为 N 的二进制数组,命名为 name,将数字 num 的二进制存到其中;

bitset<8> b2(12); //二进制长度8,将12转化为二进制存到其中。
cout << b2 << endl;

3、存储 01字符串 对应的二进制:
bitset<N> name(string); // 定义长度为 N 的二进制数组,命名为 name,将01串 string 存到其中,长度不够前补 0,长度过长截断

string s = "10010";
bitset<8> b3(s);
cout << b3 << endl;

4、存储 01字符数组 中的二进制:
bitset<N> name(char[]); // 定义长度为 N 的二进制数组,命名为 name,将 01字符数组存到其中,长度不够前补0,长度过长截断

char chs[10] = "10010";
bitset<8> b4(chs);
cout << b4 << endl;

注意:
直接输出 bitset 为正常的二进制,但是遍历所有位置来输出的话就是逆序的:

bitset<8> bs(13);
cout << bs <<endl; //00001101
for(int i=0;i<7;i++) cout<<bs[i]; //10110000

二、常用操作:
  1. 像数字一样进行 取或 或者 左移右移:
b2 |= b3; //两个二进制数取或操作; 
b2 &= b3; //两个二进制数取与操作; 
b2 ^= b3; //取异或;
b2 = ~b2; //取反; 
b2 <<= 2; //左移右移;
  1. 自带函数:
int cnt_1 = b2.count(); //查询二进制数组中,1的个数;
int len  = b2.size(); //二进制数组的长度,就是定义的长度; 
int test = b2.test(7); //判断第x个位置是0还是1,也就是输出第x个位置,注意逆序;

b2.flip(); //将二进制每一位取反;
b2.flip(3); //将二进制第x位取反;
b2.set(); //将二进制每一位置为1; reset置为0; 
b2.set(3); //将第x个位置置为1;
	
string ss = b2.to_string(); //将二进制数组转化为字符串。 

  • 51
    点赞
  • 271
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值