bitset
bitset
1 簡介
作為一個專門存儲二進制的容器,bitset 的每一個位置只能用來存儲 (0,1) ,并且每一位只占一個 bit ,也就是說,每 (8) 位占一個字節,相比之下 bool 型一位 (1) 個字節,int 型一位 (4) 個字節。
2 聲明
用 bitset 需要使用與其同名的頭文件,同時我們可以用 string 類型來初始化 bitset ,像這樣:
bitset<N> k(string("00010010"));
注意,在 bitset 中,最右邊為第 (0)? 位,以及 (N)? 為 bitset 的長度,也就是說,最高到 (N-1)? 位。
我們同樣可以通過整型來賦值 bitset ,像這樣:bitset<N> s(n) 。特別地,如果 (n) 的二進制位數超過 (N) ,我們就只取 (n) 后 (N) 位,即 (0) 到 (N-1) 位。
3 運算
bitset 支持左移,右移,以及所有的位運算:^,&,| ,不過,如果計算機字長為 (w)?? ,那么這些操作的時間復雜度都是 (O(frac{N}{w}))?? 。實際上 bitset 絕大部分的復雜度都為 (O(frac N w))? ,而 (w) 一般為 (32) 。
同時 bitset 支持單點修改,直接用 [] 改某一位就可以。用 [] 也可以訪問任意位置元素。
需要注意的是,左移并不會改變 bitset 的位數,也就是說,超過了最高位就不存儲,低位補 (0)。
4 輸入輸出
我們直接使用 cin cout 就可以。
同時 bitset 可以轉化成 string 類型和 unsigned int 類型,如果 bitset 大小大于 32 位,那么就會 RE 。
使用的函數是 to_string to_ulong ,代碼:
s.reset();
s[2] = true;
unsigned int s1 = s.to_ulong();
std::cout << s1 << std::endl; //4
unsigned long long int s2 = s.to_ullong(); //C++11
std::cout << s2 << std::endl; //4
std::string ss = s.to_string();
std::cout << ss << std::endl; //00000100
5 常用成員函數
5.1 清空操作
s.reset() 將集合內所有元素清 (0)
5.2 賦值為 (1)
s.set() 在無參數時可以把所有位置賦值為 (1) 。
如果有參數,則參數形為 (int posi,bool val) 表示把第 (posi) 位賦值為 (val) ,其余為 (1) 。
5.3 返回某一位值
s.test(int posi) 返回第 (posi) 位的值。
5.4 是否有一位為 (1)
s.any() 返回一個 bool 值,如果這個 bitset 中有一位為 (1) ,那么返回 (1) 否則返回 (0) 。
5.5 是否每一位都為 (0)
s.none() 返回一個 bool 值,看 bitset 中是否每一位都為 (0) ,是則返回 (1) 否則返回 (0) 。
5.6 數 (1) 的個數
s.count() 返回一個 bitset 中 (1) 的個數。是一個無符號整型。
5.7 取反
函數 s.flip() 可以將集合內所有蘇取反,如果引用參數 s.flip(int posi) ,那么就將第 (posi) 位取反。
總結
- 上一篇: 投资数字货币怎样开户
- 下一篇: 百行征信发短信警告可信吗 受到警告的人要