C++bitset學習筆記(超級簡化)


使用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"

 


免責聲明!

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



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