C++ bitset用法

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

函數(shù):

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

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

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

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

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

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

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

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

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

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

代碼測試:

#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
    
    //從右往左數(shù),最右邊的為第一位,向左依次加1
    v1[1] = 1;//將v1的第一位置為1
    //v1.set(1);

    cout << "v1=" << v1 << endl;//用二進(jìn)制的形式輸出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;
    //其他函數(shù)用法相似
    return 0;
}

bitset的應(yīng)用

hdu2051,輸入一個數(shù)輸出它的二進(jìn)制形式。可以用簡單的%2運(yùn)算來求,用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從小的一大興趣愛好就是學(xué)習(xí),但是他發(fā)現(xiàn)盡管他認(rèn)真學(xué)習(xí),依舊有學(xué)神考的比他好。
小Hi在高中期間參加了市里的期末考試,一共五門:語文、數(shù)學(xué)、英語、物理、化學(xué)。
成績出來之后,小Hi發(fā)現(xiàn)有些同學(xué),所有科目都考的比他好,他很煩惱。所以他想知道所有科目都比自己名次靠前的同學(xué)的人數(shù)。
為了方便,可以認(rèn)為不存在兩個人某一門名次是相同的。
其他同學(xué)們也想知道有多少人全面碾壓了他們,所以你需要對所有人輸出答案。

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

**樣例輸入**
> 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

思路:首先設(shè)法將每門科目的排名列出,開一個二維的bitset數(shù)組,根據(jù)每門科目的排名利用&運(yùn)算,求出所有科目都比當(dāng)前人名次靠前的同學(xué)的人數(shù)。
```
#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位同學(xué)的排名

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]);//名次從前往后走,依次將上一個人設(shè)為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;
}
```


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,460評論 6 538
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,067評論 3 423
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,467評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,468評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 72,184評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,582評論 1 325
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,616評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,794評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,343評論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 41,096評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,291評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,863評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,513評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,941評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,190評論 1 291
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,026評論 3 396
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 48,253評論 2 375

推薦閱讀更多精彩內(nèi)容

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