生活随笔
收集整理的這篇文章主要介紹了
Bitset 用法(STL)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
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;??????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);?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<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,空間方面嘛,稍微浪費一點也就是了。
轉載于:https://www.cnblogs.com/zxhl/p/4709572.html
總結
以上是生活随笔為你收集整理的Bitset 用法(STL)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。