Bitset 用法(STL)
2015-08-07 00:25
417 查看
std::bitset是STL的一个模板类,它的参数是整形的数值,使用位的方式和数组区别不大,相当于只能存一个位的数组。下面看一个例子
[cpp] view plaincopy
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还可以用作字符串转为整型
[cpp] view plaincopy
string bitval2;
cin>>bitval2;
// int length = strlen("11101101100");
// bitset<11>b2(bitval2);
bitset<11> b2(bitval2);
cout<<b2<<"is "<<b2.to_ulong()<<endl;
以及整形转为字符串
[cpp] view plaincopy
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,空间方面嘛,稍微浪费一点也就是了。
[cpp] view plaincopy
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还可以用作字符串转为整型
[cpp] view plaincopy
string bitval2;
cin>>bitval2;
// int length = strlen("11101101100");
// bitset<11>b2(bitval2);
bitset<11> b2(bitval2);
cout<<b2<<"is "<<b2.to_ulong()<<endl;
以及整形转为字符串
[cpp] view plaincopy
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,空间方面嘛,稍微浪费一点也就是了。
相关文章推荐
- 手把手实现tablayout随recycleview滚动而滚动(非官方coordinatorlayout实现)
- Makedown编辑器语法
- Nginx Proxy timeout排错 推荐
- _DataStructure_C_Impl:KMP模式匹配
- 链表反向打印
- 关于fragment与activity的思考,以及出现的问题
- 做题目记录
- _DataStructure_C_Impl:链串
- Android Popupwindow 显示ListView
- 运算符重载
- UITableView问题集锦
- itween插件的使用:脚本itweenPath和event的使用
- C#学习之控件:listbox显示多条数据以及周边操作
- Java里的构造函数(构造方法)
- PAT 1020. Tree Traversals (25)
- CommonJS、CMD、AMD、NodeJS创造JavaScript的未来
- define 的高级用法
- Unity Manual之Component 组件
- #每日Linux小练习#03 正则表达式
- 在Ubuntu中实现python按tab键补全