使用bitset需要引用<bitset>
頭文件。
賦值
#include<bits/stdc++.h>
using namespace std;
bitset<8>s;
int main(){
string k="01110001";
bitset<8>s(k);
cout<<s;
return 0;
}
輸出01110001
關於位怎么對應
移動
按位運算(按位 xor & |)
注意只有按位運算僅僅支持兩個長度相同bitset類型的按位運算,並且返回值是一個bitset
成員函數
reset
bitset的清空操作為reset。將集合內元素全部置零:
s.reset();
set
set有兩種用法,第一種是直接調用set不帶參數,會將bitset內所有元素置1,另一種是set后加兩個參數,分別是pos和val,意為將bitset中第pos個元素的值置為v。當v為true時可以省略不寫。
s.reset();
s.set() //11111111 s.set(3,false) //11110111 s.set(3) //11111111
使用set進行單點修改的復雜度為 O(1)O(1) , 將所有元素修改的復雜度為 O(\frac{n}{w})O(wn)
test
test有一個參數pos,返回一個bitset內第pos位的值。
s.reset();
s.set(7); int k = s.test(7); // k is true k = s.test(6); // k is false
test的時間復雜度為 O(1)O(1)
any
bitset有一個成員函數為any,返回一個布爾量。若bitset內部存在一位的值為1,則返回true,否則返回false:
s.clear();
bool k = s.any(); //k is false s[1] = true; k = s.any() //k is true
復雜度同上。按照不同編譯器版本的實現方法,.any()的常數甚至有可能小於理論值。
none
與any相對,返回一個布爾量,不存在任何一個位置的值為1則返回true,否則返回false。
s.clear();
bool k = s.none(); //k is true s[1] = true; k = s.none() //k is false
count
count返回一個bitset內1的個數,是一個無符號整形:
s.reset();
int k = s.count(); // k is 0 s[1] = true; k = s.count(); // k is 1
需要注意的是目前扶蘇已知的資料中,count的復雜度也是 O(\frac{N}{w})O(wN) 。
當然想知道0的個數可以用總長度減去count嘍
flip
flip函數類似於按位取反,它的兩個聲明如下:
bitset& flip(); bitset& flip (size_t pos);
當調用s.flip()且括號內無參數時,會將集合內所有元素取反(0變1,1變0)
當調用s.flip(x)時,會將第x位取反(從0編號)
s.reset();
s[1] = true; //s is "01000000" s.flip(); //s is "10111111" s.flip(1); //s is "11111111"