C++ bitset用法

bitset是C++語言的一個類庫,用來方便地管理一系列的bit位。
使用bitset需要導入頭文件:#include <bitset>

函數:

  • bool any(); ------ 如果有位被設置為1返回真,否則返回假。

  • size_type count(); ------ 返回bitset中被設置成1的位的個數。

  • bitset &flip(); 或 bitset &flip( size_t pos ); ------ 反置bitset中所有的位,即將1設為0,0設為1。如果指定pos,那么只有pos上的位被反置。

  • bool none(); ------ 如果沒有位被設為1返回真,否則返回假。

  • bitset &reset(); 或 bitset &reset( size_t pos ); ------ 重置bitset(全部設為0),如果指定pos,那么只有pos上的位被重置。

  • bitset &set(); 或 bitset &set( size_t pos, int val=1 ); ------ 設置bitset上所有的位,然后返回bitset。如果指定pos,那么只有pos上的位被設置。相當于v[i] = ?

  • size_t size(); ------ 返回bitset能容納的位。也就是定義時設置的位數

  • bool test( size_t pos ); ------ test()函數返回在pos上的位的值。相當于v[i]

  • string to_string(); ------ 返回bitset的字符串形式。

  • unsigned long to_ulong(); ----- 返回bitset的無符號長整數形式。

代碼測試:

#include <iostream>
#include <bitset>
using namespace std;

int main() {
    bitset<10> v1;//定義10位的bitset變量
    v1 = 8;//將v1賦值為8
    bitset<10> v2(v1);//初始化,與v1相同
    bitset<10> v3 = v2;//賦值,=v2
    
    //從右往左數,最右邊的為第一位,向左依次加1
    v1[1] = 1;//將v1的第一位置為1
    //v1.set(1);

    cout << "v1=" << v1 << endl;//用二進制的形式輸出v1
    cout << "v2=" << v2 << endl;
    cout << "v3=" << v3 << endl;
    
    for (int i = (int)(v1.size()) - 1; i >= 0; --i)//一位一位的輸出
        cout << v1[i];
    cout << endl;
    
    cout << "any() --- " << v1.any() << endl;
    cout << "count() --- " << v1.count() << endl;
    cout << "flip --- " << v1.flip() << endl;
    cout << "none() --- " << v1.none() << endl;
    //其他函數用法相似
    return 0;
}

bitset的應用

hdu2051,輸入一個數輸出它的二進制形式。可以用簡單的%2運算來求,用bitset更簡單。

#include <iostream>
#include <cmath>
#include <cstdio>
#include <string>
#include <cstring>
#include <queue>
#include <map>
#include <set>
#include <stack>
#include <utility>
#include <algorithm>
#include <iterator>
#include <bitset>
using namespace std;

#define PI 3.14159265
#define e 2.71828182

typedef long long ll;
typedef pair<int, int> P;
const int MAX_N = 1 << 17;
const int INF = 0x3f3f3f3f;

int main() {
    int n;
    while (cin >> n) {
        bitset<15> ans(n);
        bool flag = false;
        for (int i = 14; i >= 0; --i) {
            if (ans[i]) flag = true;
            if (flag) cout << ans[i];
        }
        cout << endl;
    }
    return 0;
}
```

[hiho一下 第147周](https://hihocoder.com/contest/hiho147/problem/1),這個題較難,如果想到用bitset就會很簡單。

**描述**
小Hi從小的一大興趣愛好就是學習,但是他發現盡管他認真學習,依舊有學神考的比他好。
小Hi在高中期間參加了市里的期末考試,一共五門:語文、數學、英語、物理、化學。
成績出來之后,小Hi發現有些同學,所有科目都考的比他好,他很煩惱。所以他想知道所有科目都比自己名次靠前的同學的人數。
為了方便,可以認為不存在兩個人某一門名次是相同的。
其他同學們也想知道有多少人全面碾壓了他們,所以你需要對所有人輸出答案。

**輸入**
第一行,一個正整數N(N <= 30000),表示人數。
接下來N行,每行五個整數,分別表示五門課依次的排名。
輸出
輸出共N行,每行一個整數,表示答案。

**樣例輸入**
> 4
1 1 2 2 1
2 3 3 3 2
3 2 1 1 3
4 4 4 4 4

**樣例輸出**
> 0
1
0
3

思路:首先設法將每門科目的排名列出,開一個二維的bitset數組,根據每門科目的排名利用&運算,求出所有科目都比當前人名次靠前的同學的人數。
```
#include <iostream>
#include <cmath>
#include <cstdio>
#include <string>
#include <cstring>
#include <queue>
#include <map>
#include <set>
#include <stack>
#include <utility>
#include <algorithm>
#include <iterator>
#include <bitset>
using namespace std;

#define PI 3.14159265
#define e 2.71828182

typedef long long ll;
typedef pair<int, int> P;
const int MAX_N = 30000 + 5;
const int INF = 0x3f3f3f3f;
bitset<MAX_N> ls[5][MAX_N];//ls[j][i]表示第j個科目排名為1到i的是哪些人
int arr[5][MAX_N];//arr[j][i]表示第j個科目排名為i的是誰
bitset<MAX_N> ans;
int _rank[5][MAX_N];//_rank[j][i]表示第j個科目第i位同學的排名

int main() {
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    int n;
    scanf("%d", &n);
    for (int i = 1; i <= n; ++i) {
        for (int j = 0; j < 5; ++j) {
            int val;
            scanf("%d", &val);
            arr[j][val] = i;
            _rank[j][i] = val;
        }
    }
    for (int j = 0; j < 5; ++j) {
        for (int i = 1; i <= n; ++i) {
            if (i == 1) ls[j][i] = 0;
            else {
                ls[j][i] = ls[j][i - 1];
                ls[j][i].set(arr[j][i - 1]);//名次從前往后走,依次將上一個人設為1
            }
        }
    }
    for (int i = 1; i <= n; ++i) {
        ans = ls[0][_rank[0][i]];
        for (int j = 1; j < 5; ++j) {
            ans &= ls[j][_rank[j][i]];
        }
        cout << ans.count() << endl;
    }
    return 0;
}
```


最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • C/C++輸入輸出流總結 前兩天寫C++實習作業,突然發現I/O是那么的陌生,打了好長時間的文件都沒有打開,今天終...
    LuckTime閱讀 1,753評論 0 6
  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,778評論 18 399
  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy閱讀 9,541評論 1 51
  • 十一假期里的一天,我們騎車去奧體公園玩,中午在麥當勞吃飯,與我們隔一桌坐著四個十幾歲的男孩子,從我們坐下到離開,他...
    雨娃媽媽閱讀 115評論 3 5
  • 1.學會與他人合作 現在社會生活節奏的不斷加快,周圍不斷有年輕,杰出的小鮮肉頻頻做出業績,已經工作若干年的你擔心將...
    那年的流浪狗閱讀 507評論 0 1