「STL」bitset正传

前言


之前一些需要转二进制来解决的题目我看到很多大佬用了bitset。

然而我并不会这东西。看上去很高级的样子……

改题改累了来学习一下233。

正文


一、bitset的构造

bitset有三种构造方式:string构造、整数构造和无参构造(自己瞎yy的名字)

1.无参构造:默认每一位为0。

具体代码实现:

bitset <10> a;

构造结果:0000000000

2.string构造:与char数组构造大致相同。也是附上一个01串作为bitset构造的参量传入。

具体代码实现:

string str="010110";
bitset <10> b(str);

构造结果:0000010110

3.整数构造:传入一个整数,bitset会自动转化成二进制数保存。

具体代码实现:

bitset <10> c(12);

构造结果:0000001100

二、bitset的基本运算

bitset支持所有的位运算。在这里不一一进行演示。举一个异或的例子:

具体代码实现:

bitset <20> a(string("10101101"));
bitset <20> b(string("10101100"));
cout<<(a^b)<<endl;

输出结果:00000000000000000001

三、bitset的访问和赋值

1.bitset可以通过"[""]"来访问每一位的值。

具体代码实现:

bitset <10> a("1011");
cout<<a[1]<< endl;//输出1

通过这一方法也可以对某一个位置进行赋值。

2.通过bitset自带函数test进行访问(据说和上面的访问方式比可以避免访问越界问题)

具体代码实现:

bitset <10> a("1011");
cout<<a.test(0)<<endl;

3.通过bitset自带函数set、reset进行赋值

set无参时将所有位全部置成1,reset相反。参数为位置。加入参数会将对应的位置+1置成0/1。

另外,当set函数指定两位参数时,意义为将第一参数位+1的元素置为第二参数的值。

具体代码实现:

bitset <10> a;
a.set();    //1111111111
a.reset();  //0000000000
a.set(3);   //0000001000
a.set(4);   //0000011000
a.reset(3); //0000010000
a.set(4,0); //0000000000

并没有实测不过大概是这样吧……(逃

四、其他基本函数

count():返回1的个数

any():返回是否有1

none():返回是否没有1

flip():全部取反

flip(p):将第p+1位取反

to_ulong():返回它转换为unsigned int的结果,如果超出范围则报错

to_ullong():返回它转换为unsigned long long的结果,如果超出范围则报错

to_string():返回它转换为string的结果

posted @ 2019-09-10 11:30  hzoi_Joe  阅读(196)  评论(0编辑  收藏  举报