bitset类

概述

bitset是二进制容器,只可存放1,0.没有迭代器

  template<size_t _Nb>
    class bitset
//bitset类
    : private _Base_bitset<_GLIBCXX_BITSET_WORDS(_Nb)>
    {
    private:
      typedef _Base_bitset<_GLIBCXX_BITSET_WORDS(_Nb)> _Base;
      typedef unsigned long _WordT;
//长整型

初始化

  • bitset <位数> 名字

默认是均为0,变量s1为5个0

bitset <5> s1;
cout<<s1.to_string()<<endl;

00000
  • bitset <位数> 名字(想转化为二进制的数字)

当位数正确时,变量s2为1000

bitset <4> s2(8);
cout<<s2.to_string()<<endl;



1000

当位数多时,自动在低位处补0直至补满位数

bitset<6> s2(8);

cout<<s2.to_string()<<endl;




100000

当位数少时,自动删除高位数字

biaset<2> s2(8);
cout<<s2.to_string()<<endl;




00
  • 使用string字符串初始化
string a="10000";
bitset<5> s3(a);
cout<<s5.to_string()<<endl;


10000


string a="10000";
bitset<3> s3(a);
cout<<s5.to_string()<<endl;

在a中从左至右取依次3个


100

注意!不能直接用双引号中数赋值,bitset<5> s3(10000)是错误的!

bitset<5> s3(string("10000"));是正确的

  • bitset<个数> 名字(字符串名,第几位开始(位数从左至右依次为0,1,2,3……)再依次数3个数
    string a="11010"
    bitset<3> s4(a,1,3);
    cout<<s4.to_string()<<endl;



101
  • 拷贝构造函数
    bitset<5> s7(s1);
    bitset<5> s8=s1;
扫描二维码关注公众号,回复: 4994520 查看本文章

逻辑运算

  • 位数相同才可运算

与:&;或:|;非:~;异或:^;位移运算:>>,<<

void test2()
{
    bitset<5> s1(string("11010"));
    bitset<5> s2(string("01000"));
    bitset<5> s3;

    s3=~s1;
    cout<<s3.to_string()<<endl;

    s3=s1&s2;
    s3=s1|s2;
    s3=s1^s2;
    s3=s1>>2;
    s3=s1<<2;

    s1&=s2;
    s1|=s2;
    s1^=s2;
    s1<<=2;
    s1>>=2;

}

to_string()

将无符号长整型转化为二进制输出(bitsat存储形式均为无符号长整型)

    bitset<4> s1(8);
    cout<<s1.to_string()<<endl;


1000

to_ulong()

无符号长整型输出

bitsat<5> s1(string("11010"));
cout<<to_ulong(s1)<<endl;

26

 

大小

  •  size()

返回元素个数

bitsat<5> s1(string("11010"));
cout<<s1.size()<<endl;


5
  • count()

返回s1中1的个数

bitsat<5> s1(string("11010"));
cout<<s1.count()<<endl;


3

检测

  • all()

检测s1中是否全为1,若是,返回真,若不是,返回假

bitsat<5> s1(string("11010"));
cout<<s1.all()<<endl;


0
  • any()

检测s1中是否有1,若是,返回真,若不是,返回假

bitsat<5> s1(string("11010"));
cout<<s1.any()<<endl;


1
  • none()

检测s1中是否全是0(没有1)

bitsat<5> s1(string("11010"));
cout<<s1.none()<<endl;


0
  • test(a)

检测第a个位置是否为1,从低位开始数(右),0,1,2,3……

bitsat<5> s1(string("11010"));
cout<<s1.test(3)<<endl;


1

存取

  • 编译器的0,1,2,3位输出是从低位到高位,与to_string()正好相反
    bitset<5> s2(string("11010"));
    cout<<s2.to_string()<<endl;
    cout<<s2[0]<<s2[1]<<s2[2]<<s2[3]<<s2[4]<<endl;



to_string:11010
[0]-[4]:01011
  • s[0]=1

将第0位变为1

  • set()

将所有位均置为1

    s2.set();
    cout<<s2.to_string()<<endl;

11111
  • set(n,0/1)

从低位开始数,第n位变为0/1

    
    bitset<5> s2(string("11010"));
    s2.set(1,0);
    cout<<s2.to_string()<<endl;


11000


  • reset()

复位,将所有位变为0

    bitset<5> s2(string("11010"));
    cout<<s2.reset()<<endl;


00000

查找

  • _Find_first()

从低位开始数,返回第一个为1的位置

    bitset<5> s3(string("11010"));
    cout<<s3._Find_first()<<endl;


1
  • _Find_next(n)

从第n位(0,1,2,3,4)开始数,返回第一个为1的位置,是第几个,从左向右为1,2,3,4,5

    bitset<5> s3(string("11010"));
    cout<<s3._Find_first(3)<<endl;

5

翻转

  • flip()

所有的0变1,1变0

     bitset<5> s3(string("11010"));
     cout<<s3.flip()<<endl;


00101
  • flip(n)

第n位0变1,1变0,低位开始数(0.1.2……)

     bitset<5> s3(string("11010"));
     cout<<s3.flip(2)<<endl;



01111

猜你喜欢

转载自blog.csdn.net/qq_42420263/article/details/83583774
今日推荐