1. 程式人生 > >【C++ Primer】標準庫bitset型別

【C++ Primer】標準庫bitset型別

/*
*標準庫bitset型別
*Zhi-Yun Deng
*2013-10-31
*/
#include <iostream>
#include <bitset> //標準庫bitset型別標頭檔案
#include <string>
#include <cstddef> //size_t型別定義在cstddef標頭檔案中

using std::cin;
using std::cout;
using std::endl;
using std::bitset;//bitset的using宣告
using std::string;

int main()
{

    //初始化bitset物件
    bitset<16> bitvec_01; //bitvec_01有16位,每位都為0
    bitset<32> bitvec_02(0xf00f);//bitvec_02是0xf00f的一個副本

    //bitvec_1 is smaller than the initializer
    bitset<16> bitvec_1(0xffff); //bits 0...15 are set to 1
    //bitvec_2 same size as initializer
    bitset<32> bitvec_2(0xffff); //bits 0...15 are set to 1; 16...31 are 0
    // on a 32-bit machine,bits 0 to 31 initialized from 0xffff
    bitset<128> bitvec_3(0xffff); //bits 32 through 127 initialized to zero

    string strval("1100");
    bitset<32> bitvec_4(strval); //bitvec_4是string物件strval中含有的位串的副本

    string str("1111111000000011001101");
    bitset<32> bitvec_5(str, 5, 4); //4 bits starting at str[5], 1100
    bitset<32> bitvec_6(str, str.size()-4); //use last 4 characters


    //測試初始化後的值
    cout << "*********0、初始化*********" << endl;
    cout << "bitvec_01: " << bitvec_01 << endl;
    cout << "bitvec_02: " << bitvec_02 << endl;
    cout << "bitvec_1: " << bitvec_1 << endl;
    cout << "bitvec_2: " << bitvec_2 << endl;
    cout << "bitvec_3: " << bitvec_3 << endl;
    cout << "bitvec_4: " << bitvec_4 << endl;
    cout << "bitvec_5: " << bitvec_5 << endl;
    cout << "bitvec_6: " << bitvec_6 << endl;
    cout << "****************************\n" << endl;


    //bitset物件上的操作
    //1、測試整個bitset物件
    bool is_set_1 = bitvec_01.any(); //false, all bits are zero
    bool is_set_2 = bitvec_02.any(); //true, 0xf00f
    bool is_not_set_1 = bitvec_01.none(); //true, all bits are zero
    bool is_not_set_2 = bitvec_02.none(); //false, 0xf00f
    size_t bits_set_1 = bitvec_01.count(); //returns number of bits that are on
    size_t bits_set_2 = bitvec_02.count(); //returns number of bits that are on
    size_t sz_1 = bitvec_01.size(); //returns 16
    size_t sz_2 = bitvec_02.size(); //returns 32

    cout << "****1、測試整個bitset物件****" << endl;
    cout << "is_set_1: " << is_set_1 << endl; //0
    cout << "is_set_2: " << is_set_2 << endl; //1
    cout << "is_not_set_1: " << is_not_set_1 << endl; //1
    cout << "is_not_set_2: " << is_not_set_2 << endl; //0
    cout << "bits_set_1: " << bits_set_1 << endl; //0
    cout << "bits_set_2: " << bits_set_2 << endl; //8
    cout << "sz_1: " << sz_1 << endl; //16
    cout << "sz_2: " << sz_2 << endl; //32
    cout << "******************************\n" << endl;


    //2、訪問bitset物件中的位
    cout << "***2、訪問bitset物件中的位***" << endl;
    cout << "bitvec_01: " << bitvec_01 << endl;
    for(size_t index=0; index != bitvec_01.size(); ++index)
    {//通過下標將二進位制位都置為1
        bitvec_01[index] = 1;
    }
    if(bitvec_01.test(0))
    {//用test操作測試某個位是否為1
        cout << "bitvec_01: " << bitvec_01 << endl;
    }

    bitvec_01.reset(); //重置為0
    cout << "bitvec_01: " << bitvec_01 << endl;

    for(size_t index=0; index!=bitvec_01.size(); ++index)
    {//用set操作將二進位制位置為1
        bitvec_01.set(index);
    }
    if(bitvec_01[1])
    {//測試下標操作符的返回值,測試某個位是否為1
        cout << "bitvec_01: " << bitvec_01 << endl;
    }
    cout << "*****************************\n" << endl;


    //3、對整個bitset物件進行設定
    cout << "***3、對整個bitset物件進行設定***" << endl;
    cout << "bitvec_01: " << bitvec_01 << endl;
    bitvec_01.reset(); //set all the bits to 0
    cout << "bitvec_01: " << bitvec_01 << endl;
    bitvec_01.set(); //set all the bits to 1
    cout << "bitvec_01: " << bitvec_01 << endl;
    bitvec_01.flip(0); //reverses value of first bit
    cout << "bitvec_01: " << bitvec_01 << endl;
    bitvec_01[0].flip(); //also reverses the first bit
    cout << "bitvec_01: " << bitvec_01 << endl;
    bitvec_01.flip(); //reverses value of all bits
    cout << "bitvec_01: " << bitvec_01 << endl;
    cout << "*********************************\n" << endl;


    //4、獲取bitset物件的值
    cout << "*****4、獲取bitset物件的值*****" << endl;
    unsigned long ulong = bitvec_01.to_ulong(); //returns 0
    cout << "ulong: " << ulong <<endl;
    ulong = bitvec_01.set().to_ulong(); //returns 65535 (bitvec_01 is a 16-bits bitset object.)
    cout << "ulong: " << ulong <<endl;
    cout << "********************************\n" << endl;

    return 0;
}