std::bitset是STL的一个模板类,它的参数是整形的数值,使用位的方式和数组区别不大,相当于只能存一个位的数组。下面看一个例子

  1. bitset<20> b1(5);
  2. cout<<"the set bits in bitset<5> b1(5) is:"
  3. << b1 <<endl;

结果是   the set bits in bitset<5> b1(5) is:00000000000000000101

它是以整数5传递进去,而以二进制数打印出来。

bitset还可以用作字符串转为整型

  1. string bitval2;
  2. cin>>bitval2;
  3. //  int length = strlen("11101101100");
  4. // bitset<11>b2(bitval2);
  5. bitset<11> b2(bitval2);
  6. cout<<b2<<"is  "<<b2.to_ulong()<<endl;

以及整形转为字符串

  1. int interge1;
  2. cin>>interge1;
  3. cout<<"************整数转为字符串**************"<<endl;
  4. bitset<11>b3(interge1);
  5. cout<<b3.to_ulong()<<"is  "<<b3.to_string()<<endl;

在网上看到还有一篇关于bitset写的不错的文章,不知到作者是谁,粘贴自用之:

bitset如何初始化、如何转化为double类型的小数、如何进行交叉(可以尝试用string作为中间量,因为bitset可以用string初始化的,但是这样的构造和传递会消耗很多的时间——我讨厌这种不必要的消耗!)

假如说我希望计算的精度足够高,将bitset取为64位,那么什么类型的数才能输出?如果不需要输出,那么在取精度的时候,如何将一个64位的bitset转化为double类型的小数?(可能需要自己编程实现了)

如何将一个double类型的数字转化为bitset,也就是二进制编码,方便我们做交叉、变异。

(说得简单点,以上两个就是解码和编码的问题)——文字很乱,整理一下!

如何实现两个bitset的合并?小数部分、整数部分,如果能够合并,那写程序又会方便多了!比如:两个32位的bitset合并成一个64位的bitset!(是不是又要利用string进行转换呢?如何转换?)

代码说明:将bitset的某一位置为1

  1. bitset<32> bits;
  2. for  ( int  i =0;i<5;i++)
  3. bits. set (i); //i为需要被置为1的位数
  4. cout<<bits<<endl;

bitset的函数用法

注意事项

你看得出来下面的代码为什么输出7和9吗?

  1. #include<iostream>
  2. #include<bitset>
  3. using   namespace  std;
  4. void  main()
  5. {
  6. bitset<4> bit(1111);
  7. cout<<bit.to_ulong()<<endl;
  8. bitset<4> ait(1001);
  9. cout<<ait.to_ulong()<<endl;
  10. }

原因很简单:bitset调用的构造函数,1111为十进制,换成二进制为 0x10001010111,最后4位为0111,输出就是7;如果你想规定bitset里面的每一位,那么最好用string类 型:bitset<4> bits("1111"); 这样输出就是15了。

字符串合并以及输出的问题,要搞定,还真麻烦......为了偷懒,在多个类型之间转来转去的......不过写起来真的很简单,哈哈!有现成的方法就用呗!不管效率了......

  1. #include <iostream>
  2. #include <string>
  3. #include <iostream>
  4. #include "afxwin.h"
  5. using   namespace  std;
  6. int  main(){
  7. CString s1 =  "abcd" ;
  8. CString s2 =  "xyzw" ;
  9. CString s3 = s1+s2;
  10. cout<<(LPCTSTR)s1<<endl<<(LPCTSTR)s3<<endl;
  11. string  s4 = (LPCTSTR)s3;
  12. cout<<s4<<endl;
  13. return  0;
  14. }

下面是2个bitset合并的代码例子

  1. #include <bitset>
  2. #include <iostream>
  3. #include <string>
  4. #include <iostream>
  5. #include "afxwin.h"
  6. using   namespace  std;
  7. int  main(){
  8. bitset<4> bits1( "1111" );
  9. bitset<4> bits2( "0000" );
  10. int  i = bits1.size()+bits2.size();
  11. //  bitset<i> bits3;   //不能使用动态参数作为模板参数,能不能想办法解决?
  12. bitset<128> bits3;
  13. int  j=0;
  14. for  (j=0;j<bits1.size();j++)
  15. {
  16. if  (bits1[j]==1)
  17. bits3. set (j);
  18. }
  19. for  (j=bits1.size();j<bits1.size()+bits2.size();j++)
  20. {
  21. if  (bits2[j-bits1.size()]==1)
  22. {
  23. bits3. set (j);
  24. }
  25. }
  26. cout<<bits3<<endl<<bits3.to_ulong()<<endl;
  27. return  0;
  28. }

bitset能够达到的最大长度

  1. #include <bitset>
  2. #include <vector>
  3. #include <iostream>
  4. #include <string>
  5. #include <iostream>
  6. #include "afxwin.h"
  7. using   namespace  std;
  8. int  main(){
  9. bitset<1000000> bits;// 一百万差不多到顶了,如果再加一个0,到达一千万,就会崩溃。为什么?
  10. cout<<bits[0];
  11. return  0;
  12. }

想使用动态的bitset吗?

dynamic_bitset可以满足我的需求!这实在太棒了!boost万岁!ps:不知道会造成 多大的效率影响?和固定长度的代码比较起来,虽然固定一点、浪费一点空间,但是如果更快的话,也是值得了。另外:dynamic_bitset不能在 vc6下通过编译......

bit_vector

这个“位向量组”在SGI STL中实现,VC6中没有。从名字和功能介绍上就可以看出来:这是一个可以像操作vector一样方便的容器,可以push_back每一位。效率有待实验,我是在一本书上偶然看到这个库的。

然而,令我失望的是:在ubuntu和VC6下,都没有bit_vector,必须安装SGI 版本的stl才行呢。

结论:对于这方面,看样子还是凑合着用吧!(实现简单的bitset,空间方面嘛,稍微浪费一点也就是了。

Bitset 用法(STL)的更多相关文章

  1. 位运算 进制转化 STL中bitset用法

    2017-08-17 16:27:29 writer:pprp /* 题目名称:输入十进制以二进制显示 程序说明:同上 作者:pprp 备注:无 日期:2017/8/17 */ #include &l ...

  2. 【BZOJ 1923】1923: [Sdoi2010]外星千足虫 (高斯消元异或 | BITSET用法)

    1923: [Sdoi2010]外星千足虫 Description Input 第一行是两个正整数 N, M. 接下来 M行,按顺序给出 Charles 这M次使用“点足机”的统计结果.每行 包含一个 ...

  3. C++:bitset用法

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

  4. C++标准库:bitset 用法整理&&zoj 3812

    转载: http://happyboy200032.blog.163.com/blog/static/46903113201291252033712/ 头文件:#include <bits/st ...

  5. F - Filter Gym - 100553F (bitset用法)

    题目链接:http://codeforces.com/gym/100553/attachments/download/2885/20142015-acmicpc-northeastern-europe ...

  6. C++ bitset 用法

    C++的 bitset 在 bitset 头文件中,它是一种类似数组的结构,它的每一个元素只能是0或1,每个元素仅用1bit空间. 下面是具体用法 构造函数 bitset常用构造函数有四种,如下 bi ...

  7. bitset用法

    学习博客:https://www.cnblogs.com/magisk/p/8809922.html C++的 bitset 在 bitset 头文件中,它是一种类似数组的结构,它的每一个元素只能是0 ...

  8. (转)C++ bitset用法

    今天做题发现要用到bitset,找到一篇介绍的巨好的文章. 转载自:https://www.cnblogs.com/magisk/p/8809922.html C++的 bitset 在 bitset ...

  9. 比特镇旅游(Tourist Attractions)【暴力+Bitset 附Bitset用法】

    Online Judge:NOIP2016十连测第一场 T2 Label:暴力,Bitset 题目描述 在美丽的比特镇一共有n个景区,编号依次为1到n,它们之间通过若干条双向道路连接. Byteasa ...

随机推荐

  1. win7 电脑能上网,但是下面的图标显示红叉的解决方法

    win7 电脑能上网,但是下面的图标显示红叉的解决方法 任务管理器里面结束explorer.exe进程,然后,点击文件,新建任务,输入explorer回车看看

  2. mysql 的设置

    网上的一些文章都已经比较老了,现在版本高了之后,其实配置是很省力的(不考虑什么负载的话) 分享全过程,出了文中提到的安装epel rpmfushion 源指令不同外,其他的过程也适用与Centos 5 ...

  3. .net中SessionState相关配置

      web.config关于sessionState节点的配置方案,sessionState有四种模式:off,inProc,StateServer,SqlServer. 1.off模式 从字面上就可 ...

  4. thinkphp中I方法

    概述 正如你所见到的一样,I方法是ThinkPHP众多单字母函数中的新成员,其命名来自于英文Input(输入),主要用于更加方便和安全的获取系统输入变量,可以用于任何地方,用法格式如下:I('变量类型 ...

  5. cocos代码研究(1)sprite学习笔记

    各种方法创建Sprite和Animate //图片创建法 参数一:图片资源路径 参数二:Rect选区 auto sprite = Sprite::create(, )); addChild(sprit ...

  6. 关于Unity3D中Resources动态加载NGUI图片的方法

    在NGUI中有些图片我需要动态进行变更或者加载,怎么办? 首先在项目中创建一个Resources目录,接着把需要的图片放在这里面,可以有子文件夹么?当然可以,文件结构很重要哦~ NGUI加载图片的方法 ...

  7. cocos2d 如何优化内存使用

    如何优化内存使用 内存优化原理 为优化应用内存使用,开发人员首先应该知道什么最耗应用内存,答案就是纹理! 纹理几乎会占据90%应用内存.所以尽量最小化应用的纹理内存使用,否则应用很有可能会因为低内存而 ...

  8. python4delphi 安装

    环境搭建: 目前p4d已经可以支持到XE7,可惜googlecode即将关闭,不知道作者是否会在github上继续更新. 因为此开源项目历史较久远,拿到源代码后可能还需要手动修改相关的文件引用,毕竟需 ...

  9. editorial-render A

    PROBLEM LINK: PracticeContest Author: adminTester: Kevin AtienzaEditorialist: Ajay K. VermaRussian T ...

  10. 【SpringMVC】SpringMVC系列10之视图与视图解析器

    10.视图与视图解析器 10.1.概述     请求处理方法执行完成后,最终返回一个 ModelAndView处理方法,Spring MVC 也会在内部将它们装配成一个ModelAndView 对象, ...