STL bitset用法总结
c++ bitset類用法:http://blog.csdn.net/qll125596718/article/details/6901935
C++ 參考:http://www.cplusplus.com/reference/bitset/bitset/
http://happyboy200032.blog.163.com/blog/static/46903113201291252033712/
http://blog.csdn.net/e6894853/article/details/7925846
? ? ? ??? 有些程序要處理二進制位的有序集,每個位可能包含的是0(關)或1(開)的值。位是用來保存一組項或條件的yes/no信息(有時也稱標志)的簡潔方法。標準庫提供了bitset類使得處理位集合更容易一些。要使用bitset類就必須要包含相關的頭文件。在本書提供的例子中,假設都使用了std::bitset的using聲明:
[cpp]?view plaincopy1.bitset定義和初始化
? ? ? ? ??以下列出了bitset的構造函數:
? ? ? ?這條語句把bitvec定義為含有32個位的bitset對象。和vector的元素一樣,bitset中的位是沒有命名的,程序員只能按位置來訪問它們。位集合的位置編號從0開始,因此,bitvec的位序是從0到31。以0位開始的位串是低階位(low-order bit),以31位結束的位串是高階位(high-order bit)。
1.1用unsigned值初始化bitset對象
? ? ? ? ?當用unsigned long值作為bitset對象的初始值時,該值將轉化為二進制的位模式。而bitset對象中的位集作為這種位模式的副本。如果bitset類型長度大于unsigned long值的二進制位數,則其余的高階位置為0;如果bitet類型長度小于unsigned long值的二進制位數,則只使用unsigned值中的低階位,超過bitet類型長度的高階位將被丟棄。
? ? ? ?在32位unsigned long的機器上,十六進制值0xffff表示為二進制位就是十六個1和十六個0(每個0xf可表示為1111)??梢杂?xffff初始化bitset對象:
1.2用string對象初始化bitset對象
? ? ? ? ?當用string對象初始化bitset對象時,string對象直接表示為位模式。從string對象讀入位集的順序是從右向左:
[cpp]?view plaincopy? ? ? ?string對象和bitset對象之間是反向轉化的:string對象的最右邊字符(即下標最大的那個字符)用來初始化bitset對象的低階位(即下標為0的位)。當用string對象初始化bitset對象時,記住這一差別很重要。
? ? ? ?不一定要把整個string對象都作為bitset對象的初始值。相反,可以只用某個子串作為初始值: [cpp]?view plaincopy
2.bitset上的操作
? ? ? ? ??多種bitset操作用來測試或設置bitset對象中的單個或多個二進制位:
bitset操作
| b.any() | b中是否存在置為1的二進制位? |
| b.none() | b中不存在置為1的二進制位嗎? |
| b.count() | b中置為1的二進制位的個數 |
| b.size() | b中二進制位的個數 |
| b[pos] | 訪問b中在pos處的二進制位 |
| b.test(pos) | b中在pos處的二進制位是否為1? |
| b.set() | 把b中所有二進制位都置為1 |
| b.set(pos) | 把b中在pos處的二進制位置為1 |
| b.reset() | 把b中所有二進制位都置為0 |
| b.reset(pos) | 把b中在pos處的二進制位置為0 |
| b.flip() | 把b中所有二進制位逐位取反 |
| b.flip(pos) | 把b中在pos處的二進制位取反 |
| b.to_ulong() | 用b中同樣的二進制位返回一個unsigned long值 |
| os?<<?b | 把b中的位集輸出到os流 |
bitset的函數用法
std::bitset是STL的一個模板類,它的參數是整形的數值,使用位的方式和數組區別不大,相當于只能存一個位的數組。下面看一個例子
[cpp]?view plaincopy結果是?? the set bits in bitset<5> b1(5) is:00000000000000000101
它是以整數5傳遞進去,而以二進制數打印出來。
bitset還可以用作字符串轉為整型
[cpp]?view plaincopy以及整形轉為字符串
[cpp]?view plaincopy注意事項
你看得出來下面的代碼為什么輸出7和9嗎?
原因很簡單:bitset調用的構造函數,1111為十進制,換成二進制為 0x10001010111,最后4位為0111,輸出就是7;如果你想規定bitset里面的每一位,那么最好用string類 型:bitset<4> bits("1111"); 這樣輸出就是15了。
?
字符串合并以及輸出的問題,要搞定,還真麻煩......為了偷懶,在多個類型之間轉來轉去的......不過寫起來真的很簡單,哈哈!有現成的方法就用唄!不管效率了......
下面是2個bitset合并的代碼例子
bitset能夠達到的最大長度
想使用動態的bitset嗎?
dynamic_bitset可以滿足我的需求!這實在太棒了!boost萬歲!ps:不知道會造成 多大的效率影響?和固定長度的代碼比較起來,雖然固定一點、浪費一點空間,但是如果更快的話,也是值得了。另外:dynamic_bitset不能在 vc6下通過編譯......
bit_vector
這個“位向量組”在SGI STL中實現,VC6中沒有。從名字和功能介紹上就可以看出來:這是一個可以像操作vector一樣方便的容器,可以push_back每一位。效率有待實驗,我是在一本書上偶然看到這個庫的。
然而,令我失望的是:在ubuntu和VC6下,都沒有bit_vector,必須安裝SGI 版本的stl才行呢。
2.1測試整個bitset對象
? ? ? ? ???如果bitset對象中有一個或多個二進制位置為1,則any操作返回true,也就是說,其返回值等于1;相反,如果bitset對象中的二進制位全為0,則none操作返回true。
? ? ? ? 與vector和string中的size操作一樣,bitset的size操作返回bitset對象中二進制位的個數,返回值的類型是size_t:
[cpp]?view plaincopy
2.2訪問bitset對象中的位
? ? ? ? ??可以用下標操作符來讀或寫某個索引位置的二進制位,同樣地,也可以用下標操作符測試給定二進制位的值或設置某個二進制位的值:
? ? ? ?除了用下標操作符,還可以用set、test和reset操作來測試或設置給定二進制位的值:
[cpp]?view plaincopy
[cpp]?view plaincopy
2.3對整個bitset對象進行設置
? ? ? ? ??set和reset操作分別用來對整個bitset對象的所有二進制位全置1和全置0:
[cpp]?view plaincopy
2.4獲取bitset對象的值
? ? ? ? ??to_ulong操作返回一個unsigned long值,該值與bitset對象的位模式存儲值相同。僅當bitset類型的長度小于或等于unsigned long的長度時,才可以使用to_ulong操作:
2.5輸出二進制位
? ? ? ? ? ?可以用輸出操作符輸出bitset對象中的位模式:
[cpp]?view plaincopy
2.6使用位操作符
? ? ? ??? bitset類也支持內置的位操作符。C++定義的這些操作符都只適用于整型操作數,它們所提供的操作類似于本節所介紹的bitset操作。
3.程序實例
[cpp]?view plaincopy
#include <iostream> #include <stdint.h> #include <bitset> using namespace std;int main() {for(int i=0; i<64; i++){uint64_t a = 1;uint64_t b = a << i;bitset<64> bs(b);cout << i << " \t" << bs << "," << bs.to_ulong() << endl;}bitset<64> sum_bin;sum_bin.set();cout << "\t" << sum_bin << "," << sum_bin.to_ulong() << endl;return 0; }0000000000000000000000000000000000000000000000000000000000000001,10000000000000000000000000000000000000000000000000000000000000010,20000000000000000000000000000000000000000000000000000000000000100,40000000000000000000000000000000000000000000000000000000000001000,80000000000000000000000000000000000000000000000000000000000010000,160000000000000000000000000000000000000000000000000000000000100000,320000000000000000000000000000000000000000000000000000000001000000,640000000000000000000000000000000000000000000000000000000010000000,1280000000000000000000000000000000000000000000000000000000100000000,2560000000000000000000000000000000000000000000000000000001000000000,5120000000000000000000000000000000000000000000000000000010000000000,10240000000000000000000000000000000000000000000000000000100000000000,20480000000000000000000000000000000000000000000000000001000000000000,40960000000000000000000000000000000000000000000000000010000000000000,81920000000000000000000000000000000000000000000000000100000000000000,163840000000000000000000000000000000000000000000000001000000000000000,327680000000000000000000000000000000000000000000000010000000000000000,655360000000000000000000000000000000000000000000000100000000000000000,1310720000000000000000000000000000000000000000000001000000000000000000,2621440000000000000000000000000000000000000000000010000000000000000000,5242880000000000000000000000000000000000000000000100000000000000000000,10485760000000000000000000000000000000000000000001000000000000000000000,20971520000000000000000000000000000000000000000010000000000000000000000,41943040000000000000000000000000000000000000000100000000000000000000000,83886080000000000000000000000000000000000000001000000000000000000000000,167772160000000000000000000000000000000000000010000000000000000000000000,335544320000000000000000000000000000000000000100000000000000000000000000,671088640000000000000000000000000000000000001000000000000000000000000000,1342177280000000000000000000000000000000000010000000000000000000000000000,2684354560000000000000000000000000000000000100000000000000000000000000000,5368709120000000000000000000000000000000001000000000000000000000000000000,10737418240000000000000000000000000000000010000000000000000000000000000000,21474836480000000000000000000000000000000100000000000000000000000000000000,42949672960000000000000000000000000000001000000000000000000000000000000000,85899345920000000000000000000000000000010000000000000000000000000000000000,171798691840000000000000000000000000000100000000000000000000000000000000000,343597383680000000000000000000000000001000000000000000000000000000000000000,687194767360000000000000000000000000010000000000000000000000000000000000000,1374389534720000000000000000000000000100000000000000000000000000000000000000,2748779069440000000000000000000000001000000000000000000000000000000000000000,5497558138880000000000000000000000010000000000000000000000000000000000000000,10995116277760000000000000000000000100000000000000000000000000000000000000000,21990232555520000000000000000000001000000000000000000000000000000000000000000,43980465111040000000000000000000010000000000000000000000000000000000000000000,87960930222080000000000000000000100000000000000000000000000000000000000000000,175921860444160000000000000000001000000000000000000000000000000000000000000000,351843720888320000000000000000010000000000000000000000000000000000000000000000,703687441776640000000000000000100000000000000000000000000000000000000000000000,1407374883553280000000000000001000000000000000000000000000000000000000000000000,2814749767106560000000000000010000000000000000000000000000000000000000000000000,5629499534213120000000000000100000000000000000000000000000000000000000000000000,11258999068426240000000000001000000000000000000000000000000000000000000000000000,22517998136852480000000000010000000000000000000000000000000000000000000000000000,45035996273704960000000000100000000000000000000000000000000000000000000000000000,90071992547409920000000001000000000000000000000000000000000000000000000000000000,180143985094819840000000010000000000000000000000000000000000000000000000000000000,360287970189639680000000100000000000000000000000000000000000000000000000000000000,720575940379279360000001000000000000000000000000000000000000000000000000000000000,1441151880758558720000010000000000000000000000000000000000000000000000000000000000,2882303761517117440000100000000000000000000000000000000000000000000000000000000000,5764607523034234880001000000000000000000000000000000000000000000000000000000000000,11529215046068469760010000000000000000000000000000000000000000000000000000000000000,23058430092136939520100000000000000000000000000000000000000000000000000000000000000,46116860184273879041000000000000000000000000000000000000000000000000000000000000000,92233720368547758081111111111111111111111111111111111111111111111111111111111111111,18446744073709551615
總結
以上是生活随笔為你收集整理的STL bitset用法总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python 使用 Scrapy 发送
- 下一篇: SpringBoot 自带工具类~Str