• bitset初始化问题


         在C++primer上面说,bitset可以用unsigned long来进行初始化,但是上面的例子只是采用了常数如0xffff,而在实际中,当在vs2010中,我采用unsigned long类型的变量来进行初始化时,发现说出现错误,

    error C2668: “std::bitset<_Bits>::bitset”: 对重载函数的调用不明确

    测试了下,int是4个字节,unsigned long 4个字节,long也是4个字节,但是int 和long都可以用来进行初始化

    下面是c++primer里关于bitse采用unsigned long和string进行初始化的讲解,其中尤为注意的是,在bitset中是数的低位在前高位在后

     

    下面是转载的相关的bitset的内容:

    功能:处理二进制位的有序集

    #include<bitset>

    using std::bitset;

      初始化bitset变量的方法:

    bitset<n> b;

    b有n位,每位都为0

    bitset<n> b(u);

    b是unsigned long型u的一个副本

    bitset<n> b(s);

    b是string对象s中含有的位串的副本

    bitset<n> b(s, pos, n);

    b是s中从位置pos开始的n个位的副本

    注意:n必须是常量表达式。

    例如:

       bitset<16> bitvec1(0xffff);   // bits 0 ... 15 are set to 1

       bitset<32> bitvec2(0xffff);    // bits 0...15 are set to 1; 16...31 are 0

       从string对象读入位集的的顺序是从右向左的

       string strval("1100");

       bitset<32> bitvec3(strval);

    string对象和bitset对象之间是反向转化的:string对象的最右边字符(即下标最大的那个字符)用来初始化bitset对象的低阶位(即下标为0的位)。当用string对象初始化bitset对象时,记住这一差别很重要。

       bitset对象的操作

    b.any()

    b中是否存在置为1的二进制位?

    b.none()

    b中不存在置为1的二进制位吗?

    b.count()

    b中置为1的二进制位的个数

    b.size()

    b中二进制位的个数

    b[pos]

    访问b中在pos处的二进制位

    b.test(pos)

    b中在pos处的二进制位是否为1?

    b.set()

    把b中所有二进制位都置为1

    b.set(pos)

    把b中在pos处的二进制位置为1

    b.reset()

    把b中所有二进制位都置为0

    b.reset(pos)

    把b中在pos处的二进制位置为0

    b.flip()

    把b中所有二进制位逐位取反

    b.flip(pos)

    把b中在pos处的二进制位取反

    b.to_ulong()

    用b中同样的二进制位返回一个unsigned long值

    os << b

    把b中的位集输出到os流

     

    bitset<32> bitvec;   //32bits,all zero

    bool is_set=bitvec.any();  //false,all bits are zero

    bool is_not_set=bitvec.none();   //true,all bits are zero

    size_t bits_set=bitvec.count();   //返回一个size_t类型的bits_set值,统计1的个数

    size_t类型是一个与机器相关的unsigned类型,大小足够。

    可以用下表操作符来读写或测试某个索引位置的二进制位:

    for(int index=0;index!=32;index++){

       bitvec[index]=0;

    }   //用下表操作符将所有位都置为零

    for(int index=0;index!=32;index++){

       bitvec.set(index);

    }   //用set操作将所有位都置为1

    if(bitvec.test(i))

    //测试第i位是否为1

    if(bitvec[i])

    //与上一个函数功能相同

    bitvec.set();   //全部置一

    bitvec.reset();  //全部置零

    unsigned long ulong=bitvec.to_ulong();

    cout<<"ulong="<<ulong<<endl;   //当bitvec的长度小于unsigned long时候才可以

  • 相关阅读:
    【MSSQL】MSSQL还原单mdf文件报1813错误
    【JSP】JSP基础学习记录(二)—— JSP的7个动作指令
    【JSP】JSP基础学习记录(一)—— 基础介绍以及3个编译指令
    【Other】U盘FAT32转NTFS且无数据丢失
    python map()
    python关于分割与拼接的那些事
    python shutil.copy()用法
    python enumerate用法
    工作中遇到一些难题1_5
    廖雪峰读书笔记_文件读写总结_2016_12_23
  • 原文地址:https://www.cnblogs.com/yanliang12138/p/4470733.html
Copyright © 2020-2023  润新知