bitset用法小結

bitset

bitset大概就是相似於bool數組同樣的東西html

可是它的每一個位置只佔1bit(特別特別小)ios

bitset的原理大概是將不少數壓成一個,從而節省空間和時間(暴力出奇跡)算法

通常來講bitset會讓你的算法複雜度 $/32$(具體是什麼要看計算機)數組

定義與初始化

使用bitset類型需$#include<bitset>$函數

bitset類型在定義時就須要指定所佔的空間,例如優化

bitset<233>bit;

bitset類型能夠用string和整數初始化(整數轉化成對應的二進制)spa

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

輸出結果code

00000000000000011101001
00000000000000011101001

 

基本運算

bitset支持全部位運算htm

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的結果

 

題目

這玩意兒其實挺實用的,blog

通常用來優化奇偶性有關的問題,或者判斷聯通性之類的,(或許還能夠在搜索的時候優化一下訪問標記?)

BZOJ3687

BZOJ4484

快省選了,能夠本身仍是什麼都不會,估計這兩天學新算法也沒啥意義了,就整理整理語法吧QWQ..

相關文章
相關標籤/搜索