C++ bitset用法

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

函數(shù):

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

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

  • 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能容納的位来吩。也就是定義時設置的位數(shù)

  • bool test( size_t pos ); ------ test()函數(shù)返回在pos上的位的值。相當于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;//用二進制的形式輸出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的應用

hdu2051仪糖,輸入一個數(shù)輸出它的二進制形式柑司。可以用簡單的%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從小的一大興趣愛好就是學習,但是他發(fā)現(xiàn)盡管他認真學習诬垂,依舊有學神考的比他好劲室。
小Hi在高中期間參加了市里的期末考試,一共五門:語文结窘、數(shù)學很洋、英語、物理隧枫、化學蹲缠。
成績出來之后,小Hi發(fā)現(xiàn)有些同學悠垛,所有科目都考的比他好,他很煩惱娜谊。所以他想知道所有科目都比自己名次靠前的同學的人數(shù)确买。
為了方便,可以認為不存在兩個人某一門名次是相同的纱皆。
其他同學們也想知道有多少人全面碾壓了他們湾趾,所以你需要對所有人輸出答案芭商。

**輸入**
第一行,一個正整數(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

思路:首先設法將每門科目的排名列出,開一個二維的bitset數(shù)組瑰步,根據(jù)每門科目的排名利用&運算矢洲,求出所有科目都比當前人名次靠前的同學的人數(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位同學的排名

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;
}
```


最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末读虏,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子袁滥,更是在濱河造成了極大的恐慌盖桥,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件呻拌,死亡現(xiàn)場離奇詭異葱轩,居然都是意外死亡,警方通過查閱死者的電腦和手機藐握,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進店門靴拱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人猾普,你說我怎么就攤上這事袜炕。” “怎么了初家?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵偎窘,是天一觀的道長。 經(jīng)常有香客問我溜在,道長陌知,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任掖肋,我火速辦了婚禮仆葡,結果婚禮上,老公的妹妹穿的比我還像新娘志笼。我一直安慰自己沿盅,他們只是感情好把篓,可當我...
    茶點故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著腰涧,像睡著了一般韧掩。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上窖铡,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天疗锐,我揣著相機與錄音,去河邊找鬼万伤。 笑死窒悔,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的敌买。 我是一名探鬼主播简珠,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼虹钮!你這毒婦竟也來了聋庵?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤芙粱,失蹤者是張志新(化名)和其女友劉穎祭玉,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體春畔,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡脱货,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了律姨。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片振峻。...
    茶點故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖择份,靈堂內(nèi)的尸體忽然破棺而出扣孟,到底是詐尸還是另有隱情,我是刑警寧澤荣赶,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布凤价,位于F島的核電站,受9級特大地震影響拔创,放射性物質發(fā)生泄漏利诺。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一剩燥、第九天 我趴在偏房一處隱蔽的房頂上張望立轧。 院中可真熱鬧,春花似錦、人聲如沸氛改。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽胜卤。三九已至,卻和暖如春赁项,著一層夾襖步出監(jiān)牢的瞬間葛躏,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工悠菜, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留舰攒,地道東北人。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓悔醋,卻偏偏與公主長得像摩窃,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子芬骄,可洞房花燭夜當晚...
    茶點故事閱讀 44,927評論 2 355

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

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