精华内容
下载资源
问答
  • bitset用法总结
    千次阅读 多人点赞
    2019-07-22 10:32:33

    第一行国际惯例咕咕咕。

    第二行——学习之路任重而道远。

     

    以下为正文:

    1.bitset是一种类似于数组的结构,不过区别是只能存1or0,而且优化内存空间,一个元素只占1bit

    2.相关输出只能用cout

    3.bitset的大小在编译时已经确定了

    构造

    1.<>里的参数表示bitset的大小

    2.不够的位数自动补0

    3.size小于附的值时,int取后几位,string取前几位

    4.(类型(赋值)),int可忽略类型

    5.也可以先规定一个变量,再把该变量赋值给bitset

    6.赋值字符串时只能用01字符串

    7.不进行赋初值时,默认全部为0

        int a = 5;
        string b = "1011";
        char c[4] = {'1','0','1','0'};
        bitset<10>s1(string("1001"));     //0000001001
        bitset<10>s2(int(8));             //0000001000
        bitset<10>s3(8);                  //0000001000
        bitset<4>s4(string("10001"));     //1000
        bitset<4>s5(int(32));             //0000
        bitset<4>s6;                      //0000
        bitset<4>s7(a);                   //0101
        bitset<4>s8(b);                   //1011
        bitset<4>s9(c);                   //1010

    基础运算

    1.可以用[]进行下标访问和修改

    2.二进制中&,|,^,~,>>,<<都可以进行

    3.可用!=和==,返回0or1

        bitset<4>s1(string("1001"));
        bitset<4>s2(string("1000"));
        s1[1] = 1;                    
        cout<<s1[0]<<endl;              //1
        cout<<s1<<endl;                 //1011
        cout<<(s1==s2)<<endl;           //0
        cout<<(s1!=s2)<<endl;           //1
        cout<<(s1^s2)<<endl;            //0011
        cout<<(s1&s2)<<endl;            //1000
        cout<<(s1|s2)<<endl;            //1011
        cout<<(~s1)<<endl;              //0100
        cout<<(s1>>1)<<endl;            //0101

    几个函数

        bitset<4>s1(string("1001"));
        bitset<4>s2(string("0011"));
        
        cout<<s1.count()<<endl;//用于计算s1中1的个数
        cout<<s1.size()<<endl;//s1的位数
        
        cout<<s1.test(0)<<endl;//用于检查s1[0]是0or1并返回0or1
        cout<<s1.any()<<endl;//检查s1中是否有1,并返回1or0
        cout<<s1.all()<<endl;//检查s1中是否全部为1,并返回0or1
        cout<<s1.none()<<endl;//检查s1中是否全不为1,并返回0or1
    
        cout<<s1.flip(2)<<endl;//将参数位取反,0变1,1变0
        cout<<s1.flip()<<endl;//不指定参数时,每一位取反
    
        cout<<s1.set()<<endl;//不指定参数时,每一位变为1
        cout<<s1.set(3,1)<<endl;//指定两位参数时,将第一参数位的元素变为第二参数的值,第二参数位只能为0or1
        cout<<s1.set(3)<<endl;//只有一个参数时,将参数下标处变为1
    
        cout<<s1.reset(4)<<endl;//一个参数时将参数下标处变为0
        cout<<s1.reset()<<endl;//不传参数时将bitset的每一位变为0
        
        string s = s1.to_string();  //将bitset转换成string
        unsigned long a = s1.to_ulong();  //将bitset转换成unsigned long
        unsigned long long b = s1.to_ullong();  //将bitset转换成unsigned long long
        cout<<s<<endl;
        cout<<a<<endl;
        cout<<b<<endl;

    欢迎指出错误qw

    更多相关内容
  • 详解C++ bitset用法

    2021-01-01 07:39:01
    下面是具体用法 构造函数 bitset常用构造函数有四种,如下 bitset<4> bitset1; //无参构造,长度为4,默认每一位为0 bitset<8> bitset2(12); //长度为8,二进制保存,前面用0补充 string s = 100101; ...
  • bitset用法

    2021-02-25 13:50:53
    bitset用法 介绍 bitset大概就是类似于bool数组一样的东西. 但是它的每个位置只占1bit(特别特别小) bitset的原理大概是将很多数压成一个,从而节省空间和时间(暴力出奇迹)一般来说bitset会让你的算法复杂度 /32...

    bitset用法

    介绍

    bitset大概就是类似于bool数组一样的东西.
    但是它的每个位置只占1bit(特别特别小)
    bitset的原理大概是将很多数压成一个,从而节省空间和时间(暴力出奇迹)一般来说bitset会让你的算法复杂度 /32(具体是什么要看计算机)

    定义与初始化

    1. 使用bitset类型需#include
    2. bitset类型在定义时就需要指定所占的空间,例如
      bitset<233>bit;
      bitset类型可以用string和整数初始化(整数转化成对应的二进制)
    #include<iostream>
    #include<bitset>
    #include<cstring>
    using namespace std;
    int main()
    {
        bitset<23>bit (string("11101001"));
        cout<<bit<<endl;
        bit=233;
        cout<<bit<<endl;
        return 0;
    }
    

    输出结果

    00000000000000011101001
    00000000000000011101001

    基本运算

    bitset支持所有位运算

    bitset<23>bita(string("11101001"));
    bitset<23>bitb(string("11101000"));
    cout<<(bita^bitb)<<endl;
    //输出00000000000000000000001 
    bitset<23>bita(string("11101001"));
    bitset<23>bitb(string("11101000"));
    cout<<(bita|bitb)<<endl;
    //输出00000000000000011101001
    bitset<23>bita(string("11101001"));
    bitset<23>bitb(string("11101000"));
    cout<<(bita&bitb)<<endl;
    //输出00000000000000011101000
    bitset<23>bit(string("11101001"));
    cout<<(bit<<5)<<endl;
    //输出00000000001110100100000
    bitset<23>bit(string("11101001"));
    cout<<(bit>>5)<<endl;
    //输出00000000000000000000111
    

    常用函数

    对于一个叫做bit的bitset:
    bit.size() 返回大小(位数)
    bit.count() 返回1的个数
    bit.any() 返回是否有1
    bit.none() 返回是否没有1
    bit.set() 全都变成1
    bit.set§ 将第p + 1位变成1(bitset是从第0位开始的!)
    bit.set(p, x) 将第p + 1位变成x
    bit.reset() 全都变成0
    bit.reset§ 将第p + 1位变成0
    bit.flip() 全都取反
    bit.flip§ 将第p + 1位取反
    bit.to_ulong() 返回它转换为unsigned long的结果,如果超出范围则报错
    bit.to_ullong() 返回它转换为unsigned long long的结果,如果超出范围则报错
    bit.to_string() 返回它转换为string的结果
    另外还有operation[] :可以像操作数组一样对其进行赋值,取值操作.

    本文出自:http://zwfymqz.cnblogs.com/

    展开全文
  • std::bitset是STL的一部分,准确地说,std::bitset是一个模板类,它的模板参数不是类型,而整形的数值(这一特性是ISO C++2003的新特性),有了它我们可以像使用数组一样使用位。 #include using std::bitset; 一句...
  • C++ bitset 用法

    2020-07-16 23:06:37
    C++的 bitsetbitset 头文件中,它是一种类似数组的结构,它的每一个元素只能是0或1,每个元素仅用1bit空间。 常用函数 对于一个叫做bit的bitset: bit.size() 返回大小(位数) bit.count() 返回1的个数 ...

    C++的 bitset 在 bitset 头文件中,它是一种类似数组的结构,它的每一个元素只能是0或1,每个元素仅用1bit空间。

    常用函数

    	对于一个叫做bit的bitset:
    
    	bit.size()       返回大小(位数)
    	bit.count()     返回1的个数
    	bit.any()       返回是否有1
    	bit.none()      返回是否没有1
    	bit.set()       全都变成1
    	bit.set(p)      将第p + 1位变成1(bitset是从第0位开始的!) 
    	bit.set(p, x)   将第p + 1位变成x
    	bit.reset()     全都变成0
    	bit.reset(p)    将第p + 1位变成0
    	bit.flip()      全都取反
    	bit.flip(p)     将第p + 1位取反
    	bit.to_ulong()  返回它转换为unsigned long的结果,如果超出范围则报错
    	bit.to_ullong() 返回它转换为unsigned long long的结果,如果超出范围则报错
    	bit.to_string() 返回它转换为string的结果
    

    构造函数

    bitset常用构造函数有四种,如下

    	bitset<4> bitset1;  //无参构造,长度为4,默认每一位为0
    
        bitset<8> bitset2(12);  //长度为8,二进制保存,前面用0补充
    
        string s = "100101";
        bitset<10> bitset3(s);  //长度为10,前面用0补充
        
        char s2[] = "10101";
        bitset<13> bitset4(s2);  //长度为13,前面用0补充
    
        cout << bitset1 << endl;  //0000
        cout << bitset2 << endl;  //00001100
        cout << bitset3 << endl;  //0000100101
        cout << bitset4 << endl;  //0000000010101
    

    注意:

    用字符串构造时,字符串只能包含 ‘0’ 或 ‘1’ ,否则会抛出异常。

    构造时,需在<>中表明bitset 的大小(即size)。

    在进行有参构造时,若参数的二进制表示比bitset的size小,则在前面用0补充(如上面的栗子);若比bitsize大,参数为整数时取后面部分,参数为字符串时取前面部分(如下面栗子):

    	bitset<2> bitset1(12);  //12的二进制为1100(长度为4),但bitset1的size=2,只取后面部分,即00
    
        string s = "100101";  
        bitset<4> bitset2(s);  //s的size=6,而bitset的size=4,只取前面部分,即1001
    
        char s2[] = "11101";
        bitset<4> bitset3(s2);  //与bitset2同理,只取前面部分,即1110
    
        cout << bitset1 << endl;  //00
        cout << bitset2 << endl;  //1001
        cout << bitset3 << endl;  //1110
    

    可用的操作符

    bitset对于二进制有位操作符,具体如下

    	bitset<4> foo (string("1001"));
        bitset<4> bar (string("0011"));
    
        cout << (foo^=bar) << endl;       // 1010 (foo对bar按位异或后赋值给foo)
        cout << (foo&=bar) << endl;       // 0010 (按位与后赋值给foo)
        cout << (foo|=bar) << endl;       // 0011 (按位或后赋值给foo)
    
        cout << (foo<<=2) << endl;        // 1100 (左移2位,低位补0,有自身赋值)
        cout << (foo>>=1) << endl;        // 0110 (右移1位,高位补0,有自身赋值)
    
        cout << (~bar) << endl;           // 1100 (按位取反)
        cout << (bar<<1) << endl;         // 0110 (左移,不赋值)
        cout << (bar>>1) << endl;         // 0001 (右移,不赋值)
    
        cout << (foo==bar) << endl;       // false (0110==0011为false)
        cout << (foo!=bar) << endl;       // true  (0110!=0011为true)
    
        cout << (foo&bar) << endl;        // 0010 (按位与,不赋值)
        cout << (foo|bar) << endl;        // 0111 (按位或,不赋值)
        cout << (foo^bar) << endl;        // 0101 (按位异或,不赋值)
    

    此外,可以通过 [ ] 访问元素(类似数组),注意最低位下标为0,如下:

    	bitset<4> foo ("1011");
    
    	cout << foo[0] << endl;  //1
    	cout << foo[1] << endl;  //1
    	cout << foo[2] << endl;  //0
    

    当然,通过这种方式对某一位元素赋值也是可以的,栗子就不放了。


    可用函数

    bitset还支持一些有意思的函数,比如:

    	bitset<8> foo ("10011011");
    
        cout << foo.count() << endl;  //5  (count函数用来求bitset中1的位数,foo中共有5个1
        cout << foo.size() << endl;   //8  (size函数用来求bitset的大小,一共有8位
    
        cout << foo.test(0) << endl;  //true  (test函数用来查下标处的元素是0还是1,并返回false或true,此处foo[0]为1,返回true
        cout << foo.test(2) << endl;  //false  (同理,foo[2]为0,返回false
    
        cout << foo.any() << endl;  //true  (any函数检查bitset中是否有1
        cout << foo.none() << endl;  //false  (none函数检查bitset中是否没有1
        cout << foo.all() << endl;  //false  (all函数检查bitset中是全部为1
    

    补充说明一下:test函数会对下标越界作出检查,而通过 [ ] 访问元素却不会经过下标检查,所以,在两种方式通用的情况下,选择test函数更安全一些

    另外,含有一些函数:

    	bitset<8> foo ("10011011");
    
        cout << foo.flip(2) << endl;  //10011111  (flip函数传参数时,用于将参数位取反,本行代码将foo下标2处"反转",即0变1,1变0
        cout << foo.flip() << endl;   //01100000  (flip函数不指定参数时,将bitset每一位全部取反
    
        cout << foo.set() << endl;    //11111111  (set函数不指定参数时,将bitset的每一位全部置为1
        cout << foo.set(3,0) << endl;  //11110111  (set函数指定两位参数时,将第一参数位的元素置为第二参数的值,本行对foo的操作相当于foo[3]=0
        cout << foo.set(3) << endl;    //11111111  (set函数只有一个参数时,将参数下标处置为1
    
        cout << foo.reset(4) << endl;  //11101111  (reset函数传一个参数时将参数下标处置为0
        cout << foo.reset() << endl;   //00000000  (reset函数不传参数时将bitset的每一位全部置为0
    

    同样,它们也都会检查下标是否越界,如果越界就会抛出异常

    最后,还有一些类型转换的函数,如下:

    	bitset<8> foo ("10011011");
    
        string s = foo.to_string();  //将bitset转换成string类型
        unsigned long a = foo.to_ulong();  //将bitset转换成unsigned long类型
        unsigned long long b = foo.to_ullong();  //将bitset转换成unsigned long long类型
    
        cout << s << endl;  //10011011
        cout << a << endl;  //155
        cout << b << endl;  //155
    
    展开全文
  • C++ bitset用法

    2019-10-08 16:45:38
    但是bitset的出现让位运算更透明、更清晰、更简单,它让我们能够以数组的形式去操作一个数的二进制。 我接触到它是因为在一个项目中涉及到数据编解码操作。为了节省内存空间,一些枚举值在编码阶段用位来存储(通信...

    背景

    C++中经常涉及到位运算,例如左移、右移、位与、位或、异或运算等。可能涉及到二进制转化的原因,位运算是让很多C++入门者头疼的一个篇章,即使C++有内置的运算符直接支持以上算法。但是bitset的出现让位运算更透明、更清晰、更简单,它让我们能够以数组的形式去操作一个数的二进制。

    我接触到它是因为在一个项目中涉及到数据编解码操作。为了节省内存空间,一些枚举值在编码阶段用位来存储(通信行业和地图行业用的比较多),例如bit0用来表示"状态1",bit1用来表示"状态2",bit2用来表示"状态3"…,在解码时为了得到这些状态,就需要对bit位进行读取和识别,比如想知道"状态2"的值是多少?都有哪些状态是开启的(bit位值为1)?等等。

    C++的 bitset在bitset 头文件中,它是一种类似数组的结构,它的每一个元素只能是0或1,每个元素仅用1bit空间。

    下面是具体用法

    构造函数

    bitset常用构造函数有四种,如下:

    bitset<4> bitset1;  //无参构造,长度为4,默认每一位为0
    
    bitset<8> bitset2(12);  //长度为8,二进制保存,前面用0补充
    
    string s = "100101";
    bitset<10> bitset3(s);  //长度为10,前面用0补充
        
    char s2[] = "10101";
    bitset<13> bitset4(s2);  //长度为13,前面用0补充
    
    cout << bitset1 << endl;  //0000
    cout << bitset2 << endl;  //00001100
    cout << bitset3 << endl;  //0000100101
    cout << bitset4 << endl;  //0000000010101
    
    注意:

    用字符串构造时,字符串只能包含 ‘0’ 或 ‘1’ ,否则会抛出异常。
    构造时,需在<>中表明bitset 的大小(即size)。
    在进行有参构造时,若参数的二进制表示比bitset的size小,则在前面用0补充(如上面的栗子);若比bitsize大,参数为整数时取后面部分,参数为字符串时取前面部分(如下面栗子):

    bitset<2> bitset1(12);  //12的二进制为1100(长度为4),但bitset1的size=2,只取后面部分,即00
    
    string s = "100101";  
    bitset<4> bitset2(s);  //s的size=6,而bitset的size=4,只取前面部分,即1001
    
    char s2[] = "11101";
    bitset<4> bitset3(s2);  //与bitset2同理,只取前面部分,即1110
    
    cout << bitset1 << endl;  //00
    cout << bitset2 << endl;  //1001
    cout << bitset3 << endl;  //1110
    

    可用的操作符

    bitset对于二进制有位操作符,具体如下

    bitset<4> foo (string("1001"));
    bitset<4> bar (string("0011"));
    
    cout << (foo^=bar) << endl;       // 1010 (foo对bar按位异或后赋值给foo)
    cout << (foo&=bar) << endl;       // 0010 (按位与后赋值给foo)
    cout << (foo|=bar) << endl;       // 0011 (按位或后赋值给foo)
    
    cout << (foo<<=2) << endl;        // 1100 (左移2位,低位补0,有自身赋值)
    cout << (foo>>=1) << endl;        // 0110 (右移1位,高位补0,有自身赋值)
    
    cout << (~bar) << endl;           // 1100 (按位取反)
    cout << (bar<<1) << endl;         // 0110 (左移,不赋值)
    cout << (bar>>1) << endl;         // 0001 (右移,不赋值)
    
    cout << (foo==bar) << endl;       // false (0110==0011为false)
    cout << (foo!=bar) << endl;       // true  (0110!=0011为true)
    
    cout << (foo&bar) << endl;        // 0010 (按位与,不赋值)
    cout << (foo|bar) << endl;        // 0111 (按位或,不赋值)
    cout << (foo^bar) << endl;        // 0101 (按位异或,不赋值)
    

    此外,可以通过 [ ] 访问元素(类似数组),注意最低位下标为0,如下:

    bitset<4> foo ("1011");
        
    cout << foo[0] << endl;  //1
    cout << foo[1] << endl;  //1
    cout << foo[2] << endl;  //0
    

    可用函数

    bitset还支持一些有意思的函数,比如:

    bitset<8> foo ("10011011");
    
    cout << foo.count() << endl;  //5  (count函数用来求bitset中1的位数,foo中共有5个1
    cout << foo.size() << endl;   //8  (size函数用来求bitset的大小,一共有8位
    
    cout << foo.test(0) << endl;  //true  (test函数用来查下标处的元素是0还是1,并返回false或true,此处foo[0]为1,返回true
    cout << foo.test(2) << endl;  //false  (同理,foo[2]为0,返回false
    
    cout << foo.any() << endl;  //true  (any函数检查bitset中是否有1
    cout << foo.none() << endl;  //false  (none函数检查bitset中是否没有1
    cout << foo.all() << endl;  //false  (all函数检查bitset中是全部为1
    

    补充说明一下:test函数会对下标越界作出检查,而通过 [ ] 访问元素却不会经过下标检查,所以,在两种方式通用的情况下,选择test函数更安全一些

    另外,含有一些函数:

     bitset<8> foo ("10011011");
    
    cout << foo.flip(2) << endl;  //10011111  (flip函数传参数时,用于将参数位取反,本行代码将foo下标2处"反转",即0变1,1变0
    cout << foo.flip() << endl;   //01100000  (flip函数不指定参数时,将bitset每一位全部取反
    
    cout << foo.set() << endl;    //11111111  (set函数不指定参数时,将bitset的每一位全部置为1
    cout << foo.set(3,0) << endl;  //11110111  (set函数指定两位参数时,将第一参数位的元素置为第二参数的值,本行对foo的操作相当于foo[3]=0
    cout << foo.set(3) << endl;    //11111111  (set函数只有一个参数时,将参数下标处置为1
    
    cout << foo.reset(4) << endl;  //11101111  (reset函数传一个参数时将参数下标处置为0
    cout << foo.reset() << endl;   //00000000  (reset函数不传参数时将bitset的每一位全部置为0
    

    同样,它们也都会检查下标是否越界,如果越界就会抛出异常

    最后,还有一些类型转换的函数,如下:

    bitset<8> foo ("10011011");
    
    string s = foo.to_string();  //将bitset转换成string类型
    unsigned long a = foo.to_ulong();  //将bitset转换成unsigned long类型
    unsigned long long b = foo.to_ullong();  //将bitset转换成unsigned long long类型
    
    cout << s << endl;  //10011011
    cout << a << endl;  //155
    cout << b << endl;  //155
    
    展开全文
  • bitset用法 bitset用法

    2010-04-02 21:07:12
    bitset用法bitset用法bitset用法bitset用法bitset用法bitset用法
  • STL:bitset用法详解

    2021-09-22 20:50:57
    官方比赛可以使用! 声明 开就完了 尖括号里是大小 还可以初始化 注意这里的赋值时从低位到高位 bitset<10>a1; bitset<10>a2((string)"010110"); 输入输出 只能用cout对整体进行输出 蒟蒻并不会输入 ...
  • bitset 用法

    2019-08-08 19:18:17
    bitset<8> bitset2(12);//长度为8,二进制保存,前面用0补充 string s = "100101"; bitset<10> bitset3(s);//长度为10,前面用0补充 char s2[] = "10101"; bitset<13> bitset4(s2);//长度为13,前面用0...
  • C++ bitset用法一文通

    2020-11-12 17:25:13
    C++的 bitsetbitset 头文件中,它是一种类似数组的结构,它的每一个元素只能是0或1,每个元素仅用1bit空间。 **需要添加头文件#include <bitset>; 构造函数 //通式 bitset<大小> 名称(初始值) ...
  • bitset用法讲解

    千次阅读 2019-05-22 14:52:21
    bitset用法讲解 1.定义申请 代码 说明 bitset<100> cp[100]; 定义一个二进制数组 bitset<100> cp 定义一个二进制数 bitset<100> b(s, pos, 100); 从s的pos位置开始复制100个数到b ...
  • c++bitset用法详解(超简单)——蒟蒻函数

    千次阅读 多人点赞 2020-09-08 16:51:06
    bitset 相当于一个二进制的数组,并且可以直接用01串赋值 bitset<4>a1;//长度为4,默认以0填充 bitset<8>a2;//长度为8,将12以二进制保存,前面用0补充 string s = "100101"; bitset<10>a3(s)...
  • Bitset用法

    2020-07-31 12:09:26
    {“code”:0,“data”:null,“debugLogs”:null,“ext”:null,“message”:null}
  • 主要介绍了浅谈Java BitSet使用场景和代码示例,具有一定借鉴价值,需要的朋友可以参考下。
  • stl位图bitset用法

    2021-03-29 09:46:09
    转自 bitset大法好 bitset存储二进制数位。 bitset就像一个bool类型的数组一样,但是有空间优化。 bitset中的每个元素都能单独被访问,例如对于一个叫做a的bitset,表达式a[3]访问了它的第4个元素,就像数组一样。 ...
  • bitset用法整理

    千次阅读 2017-03-02 21:13:38
    转载自:http://blog.csdn.net/e6894853/article/details/7925846在项目中需要使用到10进制48位的数字按二进制由高到低解释,然后按每一位是0还是1... 如下:bitset 用法整理 构造函数 bitset<n> b; b有n位,每位都为0
  • C++bitset用法

    2019-11-09 09:53:31
    作用含义 C++bitsetbitset...bitset常用的四种构造方法 bitset<4> bitset1; //无参构造,长度为4,默认每一位为0 bitset<8> bitset2(12); //长度为8,二进制保存,前面用0补充 string ...
  • Java中BitSet的基本用法 JAVA中BitSet就是“位图”数据结构,根据“位图”的语义,数据的存在性可以使用bit位上的1或0来表示;一个bit具有2个值:0和1,正好可以用来表示false和true 就是BitSet中一位就表示一个...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 14,281
精华内容 5,712
关键字:

bitset用法