天天看點

C++标準庫bitset

#include <bitset>
#include <iostream>

using namespace std;
//using std::bitset

int main()
{
    //1.bitset對象的定義和初始化
    //bitset<n> b;            //b 有 n 位,每位都 0
    //bitset<n> b(u);         //b 是 unsigned long 型 u 的一個副本
    //bitset<n> b(s);         //b 是 string 對象 s 中含有的位串的副本,如果不是位串,會抛出異常
    //bitset<n> b(s, pos, n); //b 是 s 中從位置 pos 開始的&nbps;n 個位的副本

    //bitset<32> bitvec;      // 32 bits, all zero
    //用unsigned值初始化bitset對象
    //bitset<16> bitvec1(0xffff);     // bits 0 ... 15 are set to 1
    //bitset<32> bitvec2(0xffff);     // bits 0 ... 15 are set to 1; 16 ... 31 are 0
    //bitset<128> bitvec3(0xffff);    // bits 32 through 127 initialized to zero

    //用string對象初始化bitset對象
    //當用 string 對象初始化 bitset 對象時,string 對象直接表示為位模式。從 string 對象讀入位集的順序是從右向左(from right to left):
    //bitvec4 的位模式中第 2 和 3 的位置為 1,其餘位置都為 0。如果 string 對象的字元個數小于 bitset 類型的長度,則高階位置為 0。
    //string strval("1100");
    //bitset<32> bitvet4(strval);

    //string str("11110000");
    //bitset<32> bitvec5(str, 3, 4);  //starting at str[3] 1000
    //bitset<32> bitvec6(str, str.size()-3);  //如果省略第三個參數,意味着從開始位置一直到string末尾的所有字元, 本例為最後3個字元,即000

    //2.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.any()         b 中是否存在置為 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
    //bitset<32> bitvec;
    //bool is_set = bitvec.any();
    //bool is_not_set = bitvec.none();
    //size_t bits_set = bitvec.count();
    //size_t size = bitvec.size();    //return 32
    //通路bitset對象中的位
    //for (int i=0; i != 32; i += 2)
    //{
    //    bitvec[i] = 1;
    //}

    //for (int i=0; i != 32; i += 2)
    //{
    //    bitvec.set(i);
    //}

    //for (int i = 0; i != 32; i++)
    //{
    //    if (bitvec.test(i)) //or if(bitvec[i])
    //    {
    //    }
    //}

    //對整個bitset對象進行設定
    //bitvec.reset();     //set all bits 0
    //bitvec.set();       //set all bits 1
    //bitvec.flip(0);     //對 bitvec[0] 取反
    //bitvec[0].flip();   //對 bitvec[0] 取反
    //bitvec.flip();      //對所有bit位取反

    //擷取bitset對象的值
    //to_ulong 操作傳回一個 unsigned long 值,該值與 bitset 對象的位模式存儲值相同。
    //僅當 bitset 類型的長度小于或等于 unsigned long 的長度時,才可以使用 to_ulong 操作
    //如果 bitset 對象包含的二進制位數超過 unsigned long 長度,将會産生運作時異常
    //unsigned long ulong = bitvec.to_ulong();

    //輸出二進制位
    //bitset<32> bitvec(0xffff);
    //cout<<"bitvec = "<<bitvec<<endl;    //bitvec = 00000000000000001111111111111111]
    
    return 0;
}
           

繼續閱讀