#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;
}