Bitset 用法(STL)
std::bitset是STL的一个模板类,它的参数是整形的数值,使用位的方式和数组区别不大,相当于只能存一个位的数组。下面看一个例子
- bitset<20> b1(5);
- cout<<"the set bits in bitset<5> b1(5) is:"
- << b1 <<endl;
结果是 the set bits in bitset<5> b1(5) is:00000000000000000101
它是以整数5传递进去,而以二进制数打印出来。
bitset还可以用作字符串转为整型
- string bitval2;
- cin>>bitval2;
- // int length = strlen("11101101100");
- // bitset<11>b2(bitval2);
- bitset<11> b2(bitval2);
- cout<<b2<<"is "<<b2.to_ulong()<<endl;
以及整形转为字符串
- int interge1;
- cin>>interge1;
- cout<<"************整数转为字符串**************"<<endl;
- bitset<11>b3(interge1);
- 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
- bitset<32> bits;
- for ( int i =0;i<5;i++)
- bits. set (i); //i为需要被置为1的位数
- cout<<bits<<endl;
bitset的函数用法

注意事项
你看得出来下面的代码为什么输出7和9吗?
- #include<iostream>
- #include<bitset>
- using namespace std;
- void main()
- {
- bitset<4> bit(1111);
- cout<<bit.to_ulong()<<endl;
- bitset<4> ait(1001);
- cout<<ait.to_ulong()<<endl;
- }
原因很简单:bitset调用的构造函数,1111为十进制,换成二进制为 0x10001010111,最后4位为0111,输出就是7;如果你想规定bitset里面的每一位,那么最好用string类 型:bitset<4> bits("1111"); 这样输出就是15了。
字符串合并以及输出的问题,要搞定,还真麻烦......为了偷懒,在多个类型之间转来转去的......不过写起来真的很简单,哈哈!有现成的方法就用呗!不管效率了......
- #include <iostream>
- #include <string>
- #include <iostream>
- #include "afxwin.h"
- using namespace std;
- int main(){
- CString s1 = "abcd" ;
- CString s2 = "xyzw" ;
- CString s3 = s1+s2;
- cout<<(LPCTSTR)s1<<endl<<(LPCTSTR)s3<<endl;
- string s4 = (LPCTSTR)s3;
- cout<<s4<<endl;
- return 0;
- }
下面是2个bitset合并的代码例子
- #include <bitset>
- #include <iostream>
- #include <string>
- #include <iostream>
- #include "afxwin.h"
- using namespace std;
- int main(){
- bitset<4> bits1( "1111" );
- bitset<4> bits2( "0000" );
- int i = bits1.size()+bits2.size();
- // bitset<i> bits3; //不能使用动态参数作为模板参数,能不能想办法解决?
- bitset<128> bits3;
- int j=0;
- for (j=0;j<bits1.size();j++)
- {
- if (bits1[j]==1)
- bits3. set (j);
- }
- for (j=bits1.size();j<bits1.size()+bits2.size();j++)
- {
- if (bits2[j-bits1.size()]==1)
- {
- bits3. set (j);
- }
- }
- cout<<bits3<<endl<<bits3.to_ulong()<<endl;
- return 0;
- }
bitset能够达到的最大长度
- #include <bitset>
- #include <vector>
- #include <iostream>
- #include <string>
- #include <iostream>
- #include "afxwin.h"
- using namespace std;
- int main(){
- bitset<1000000> bits;// 一百万差不多到顶了,如果再加一个0,到达一千万,就会崩溃。为什么?
- cout<<bits[0];
- return 0;
- }
想使用动态的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)的更多相关文章
- 位运算 进制转化 STL中bitset用法
2017-08-17 16:27:29 writer:pprp /* 题目名称:输入十进制以二进制显示 程序说明:同上 作者:pprp 备注:无 日期:2017/8/17 */ #include &l ...
- 【BZOJ 1923】1923: [Sdoi2010]外星千足虫 (高斯消元异或 | BITSET用法)
1923: [Sdoi2010]外星千足虫 Description Input 第一行是两个正整数 N, M. 接下来 M行,按顺序给出 Charles 这M次使用“点足机”的统计结果.每行 包含一个 ...
- C++:bitset用法
std::bitset是STL的一部分,准确地说,std::bitset是一个模板类,它的模板参数不是类型,而整形的数值(这一特性是ISO C++2003的新特性),有了它我们可以像使用数组一样使用位 ...
- C++标准库:bitset 用法整理&&zoj 3812
转载: http://happyboy200032.blog.163.com/blog/static/46903113201291252033712/ 头文件:#include <bits/st ...
- F - Filter Gym - 100553F (bitset用法)
题目链接:http://codeforces.com/gym/100553/attachments/download/2885/20142015-acmicpc-northeastern-europe ...
- C++ bitset 用法
C++的 bitset 在 bitset 头文件中,它是一种类似数组的结构,它的每一个元素只能是0或1,每个元素仅用1bit空间. 下面是具体用法 构造函数 bitset常用构造函数有四种,如下 bi ...
- bitset用法
学习博客:https://www.cnblogs.com/magisk/p/8809922.html C++的 bitset 在 bitset 头文件中,它是一种类似数组的结构,它的每一个元素只能是0 ...
- (转)C++ bitset用法
今天做题发现要用到bitset,找到一篇介绍的巨好的文章. 转载自:https://www.cnblogs.com/magisk/p/8809922.html C++的 bitset 在 bitset ...
- 比特镇旅游(Tourist Attractions)【暴力+Bitset 附Bitset用法】
Online Judge:NOIP2016十连测第一场 T2 Label:暴力,Bitset 题目描述 在美丽的比特镇一共有n个景区,编号依次为1到n,它们之间通过若干条双向道路连接. Byteasa ...
随机推荐
- input file美化
<style> a{display:inline-block; width:100px; height:40px; position:relative; overflow:hidden;} ...
- web前端跨域方案
ajax跨域请求 qzfl实现 跨子域的xhr 原生xhr不支持跨域,通过iframe+proxy.html达到跨子域 假如A页面要请求B页面,A.B跨子域.A创建指向B的proxy页的ifram ...
- [Effective JavaScript 笔记]第28条:不要信赖函数对象的toString方法
js函数有一个非凡的特性,即将其源代码重现为字符串的能力. (function(x){ return x+1 }).toString();//"function (x){ return x+ ...
- Unity3d 去掉exe版本的边框
原地址:http://blog.sina.com.cn/s/blog_697b1b8c0101gd4h.html using System; using System.Runtime.InteropS ...
- lvs之ip-tun(ip隧道)技术的学习与实践
1.配置测试环境 修改IP windows 200.168.10.4 lvs server ip:200.168.10.1 因为IP隧道模式只需要一个网卡 所以就停掉其他网卡 web server ...
- C#开发实例 鼠标篇
鼠标的操作控制: 鼠标是计算机的一个重要组成部分,有很多默认的设置,如双击时间间隔,闪烁频率,移动速度等,本篇使用C#获取这些基本的信息. 1.1获取鼠标信息 ①实例001 获取鼠标双击时间间隔 主要 ...
- 影像工作站的数据库安装错误之Win7系统下pg服务无法启动
1.关闭批处理 2.修改 PG安装路径下的Data文件下的pg_hba.conf文件中去掉IPv6的井号,如下图 3.结束pg进程 4.重启PG服务.
- 最长公共子串 NYOJ 36
http://acm.nyist.net/JudgeOnline/problem.php?pid=36 最长公共子序列 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 ...
- win7安装ubuntu后,进入不了win7
方法一:进去ubuntu系统后,终端下输入如下命令:sudo update-grub,输入命令后,会提示寻找win7,ubuntu系统.并自动建立引导详情链接:http://zhidao.baidu. ...
- 【Hibernate】Hibernate系列6之HQL查询
HQL查询 6.1.概述 6.2.分页查询 6.3.命名查询 6.4.投影查询-部分字段查询 6.5.报表查询 6.6.迫切左外连接.左外连接 6.7.迫切内连接.内连接 6.8.QBC查询.本地查询