包含頭文件bitset #include < bitset >
bitset類
類模板
template <size_t N> class bitset;
bitset,從名字就可以看出來,是一個(比特)二進制(0和1)的集合
使用bitset必須指定類模板參數N,N表示bitset有幾位
bitset在內存中是以4或8個字節為單位存儲的
sizeof(bitset<1>) 4 1位的時候占4個字節
sizeof(bitset<32>) 4 32位的時候占4個字節
sizeof(bitset<33>) 8 33位的時候占8個字節
sizeof(bitset<65>) 16 65位的時候占個16字節 (2倍增長動態分配內存空間的機制在計算機中很常見,c++的vector內存也是這樣)
構造函數 :
//1.默認構造函數 :0
bitset<10> a; //a:0000000000
//2.用一個數值初始化
(1)當用一個數值去構造的時候,其實就是將數值在內存中的存儲方式顯示出來。(數值在內存中是以補碼形式存儲的)
(2)若bitset的位數n小於數值的位數,只取數值(小端的)前n位初始化給bitset
bitset<4> a(-16); //-16的補碼為11111111.....10000,a有4位,因此a:0000
bitset<5> a(17); //17的補碼為00000000.....10001,a有5位,因此a:10001
bitset<6> a(-8); //-8的補碼為 11111111.....11000,a有6位,因此a:111000
bitset<7> a(8); //8的補碼為 00000000.....01000,a有7位,因此a:0001000
//3.用字符串string 或者 char[]初始化
//以string為例,char[]與其用法相同
string b = "100101111"; //這里特別注意,bitset的size和字符串長度不匹配的時候如何構造
bitset<3> a(b); //a:100 //當bitset的size小於等於字符串長度,取字符串的前size位
bitset<6> a(b); //a:100101
bitset<9> a(b); //a:100101111
bitset<12> a(b); //a:000100101111 //當bitset的size大於字符串長度,進行補零
運算符重載[],支持下標從0開始訪問,與數組類似
注意 :下標小的是小端
bitset<4> a; //a:0000(默認構造函數)
a[0] = 1;
a[2] = 1;
//a:0101
bitset<7> b("1001101");
for (int i = 0; i < 7; i++)
cout << b[i] << ' ';//輸出:1011001
成員函數 :
count 返回bitset中 1 的個數
//成員函數聲明
size_t count() const;
//用例
bitset<6> a("011101");
cout << a.count() // 4
size 返回size大小
//成員函數聲明
size_t size() const;
//用例:
bitset<6> a("011101");
cout << a.size(); // 6
test 返回某一位(下標)是否為1
//成員函數聲明
bool test (size_t pos) const;
//用例:
bitset<6> a("011101");
cout << a.test(0) << endl; //1 (true)
cout << a.test(1) << endl; //0 (false)
cout << a.test(5) << endl; //0 (false)
any 只要有一位是1,就返回true,否則返回false
//成員函數聲明
bool any() const;
//用例:
cout << bitset<4>("0001").any() << endl; //1 (true)
cout << bitset<4>("0000").any() << endl; //0 (false)
none 若全為0,返回true,否則返回false
//成員函數聲明
bool none() const;
//用例:
cout << bitset<4>("0000").none() << endl; //1 (true)
cout << bitset<4>("0001").none() << endl; //0 (false)
all 若全為1,返回true,否則返回false
//成員函數聲明
bool all() const noexcept;
//用例:
cout << bitset<4>("1111").all() << endl; //1 (true)
cout << bitset<4>("1101").all() << endl; //0 (false)
set 全部置1,或者某一位置1或0
//成員函數聲明
bitset& set() noexcept;
//用例:
//1.
bitset<6> a("011101");
a.set();
cout << a << endl; //輸出:111111
//2.set也可以指定參數,第一個參數是索引,第二個true表示置1,false表示置0
bitset& set (size_t pos, bool val = true);
//
bitset<6> a("011101");
a.set(0,0);
a.set(5,1);
cout << a << endl; //輸出:111100
reset 全部置0,或者某一位置0
//成員函數聲明
bitset& reset();
bitset& reset (size_t pos);
//用例:
bitset<6> a("011101");
a.reset();
cout << a << endl; //輸出:000000
//也可以指定參數,單獨將某一位置0
bitset<6> a("011101");
a.reset(0);
cout << a << endl; //輸出:011100
flip 全部取反,或者某一位取反
//成員函數聲明
bitset& flip();
bitset& flip (size_t pos);
//用例:
bitset<6> a("011101");
a.flip();
cout << a << endl; //輸出:100010
//也可以指定參數,單獨將某一位取反
bitset<6> a("011101");
a.flip(0);
a.flip(1);
cout << a << endl; //輸出:011110
to_string( ) 轉換為字符串
bitset<6> a("011101");
auto x = a.to_string();
cout << x ; // 011101
to_ulong( ) 轉換為無符號long類型
bitset<6> a("011101");
auto x = a.to_ulong();
cout << x ; // 輸出:29 1 + 4 + 8 + 16 = 29
to_ullong( ) 轉換為無符號long long類型
bitset<6> a("011101");
auto x = a.to_ullong(); //同上
cout << x ; //29