bitset
bitset大概就是類似於bool數組一樣的東西
但是它的每個位置只占1bit(特別特別小)
bitset的原理大概是將很多數壓成一個,從而節省空間和時間(暴力出奇跡)
一般來說bitset會讓你的算法復雜度 $/32$(具體是什么要看計算機)
定義與初始化
使用bitset類型需$#include<bitset>$
bitset類型在定義時就需要指定所占的空間,例如
bitset<233>bit;
bitset類型可以用string和整數初始化(整數轉化成對應的二進制)
#include<iostream> #include<bitset> #include<cstring> using namespace std; int main() { bitset<23>bit (string("11101001")); cout<<bit<<endl; bit=233; cout<<bit<<endl; return 0; }
輸出結果
00000000000000011101001 00000000000000011101001
基本運算
bitset支持所有位運算
bitset<23>bita(string("11101001")); bitset<23>bitb(string("11101000")); cout<<(bita^bitb)<<endl; //輸出00000000000000000000001
bitset<23>bita(string("11101001")); bitset<23>bitb(string("11101000")); cout<<(bita|bitb)<<endl; //輸出00000000000000011101001
bitset<23>bita(string("11101001")); bitset<23>bitb(string("11101000")); cout<<(bita&bitb)<<endl; //輸出00000000000000011101000
bitset<23>bit(string("11101001")); cout<<(bit<<5)<<endl; //輸出00000000001110100100000
bitset<23>bit(string("11101001")); cout<<(bit>>5)<<endl; //輸出00000000000000000000111
常用函數
對於一個叫做bit的bitset: bit.size() 返回大小(位數) bit.count() 返回1的個數 bit.any() 返回是否有1 bit.none() 返回是否沒有1 bit.set() 全都變成1 bit.set(p) 將第p + 1位變成1(bitset是從第0位開始的!) bit.set(p, x) 將第p + 1位變成x bit.reset() 全都變成0 bit.reset(p) 將第p + 1位變成0 bit.flip() 全都取反 bit.flip(p) 將第p + 1位取反 bit.to_ulong() 返回它轉換為unsigned long的結果,如果超出范圍則報錯 bit.to_ullong() 返回它轉換為unsigned long long的結果,如果超出范圍則報錯 bit.to_string() 返回它轉換為string的結果
題目
這玩意兒其實挺實用的,
一般用來優化奇偶性有關的問題,或者判斷聯通性之類的,(或許還可以在搜索的時候優化一下訪問標記?)
快省選了,可以自己還是什么都不會,估計這兩天學新算法也沒啥意義了,就整理整理語法吧QWQ..
