bitset用法小結


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

 

題目

這玩意兒其實挺實用的,

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

BZOJ3687

BZOJ4484

快省選了,可以自己還是什么都不會,估計這兩天學新算法也沒啥意義了,就整理整理語法吧QWQ..

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM