【C++ Primer】標準庫bitset型別
阿新 • • 發佈:2019-01-22
/* *標準庫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; }