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吗?

    • #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,空间方面嘛,稍微浪费一点也就是了。)

 

参考文献:

http://www.programbbs.com/doc/3012.htm 可以借鉴这篇文章中,传统的C方式操作位。不过在本文中,不是重点(C的方式很丑陋呢......)

http://dev.csdn.net/article/70/70814.shtm 位向量的应用

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值