1. 程式人生 > >【bitset】C++方便快捷的位元位管理標準庫

【bitset】C++方便快捷的位元位管理標準庫

0x00 前言

C++的STL向來是一個非常厲害且好用的東西,
提供了大量近乎優化到極致的解決方案,在日常程式設計或是競賽中,
STL使用的嫻熟可以省去大量的時間和腦力得出非常優質的解法,
這回是我突然看見了bitset這個我不太常使用的類庫,用於狀態壓縮非常巧妙,
於是決定相見即是有緣,就好好的學習一下吧——

通常的解釋為:

bitset
C++語言的一個類庫,用來方便地管理一系列的bit位而不用程式設計師自己來寫程式碼。
bitset除了可以訪問指定下標的bit位以外,還可以把它們作為一個整數來進行某些統計。

0x01 測試程式碼

SOURCE

/*==========================================================================
#   Copyright (C) 2018 All rights reserved.
#
#   filename : test_bitset.cpp
#   author   : chendian / 
[email protected]
# date : 2018-08-08 # ==========================================================================*/
#include <bitset> #include <string> #include <iostream> #include <algorithm> using namespace std; typedef long long ll; int initial(bool flag=false) { string
s = "00010111"; string t = "1111111100010111"; string r = "11101000"; bitset<8> z; // init with all-zero bitset<8> a(s); // init with string object bitset<8> b(23); // init with integer bitset<8> c(0x17); // init with hex bitset<8> d(t, 8, 8); // init with substring
bitset<8> e(string(r.rbegin(), r.rend())); // init with reversed string z[4] = z[2] = z[1] = z[0] = 1; // assignment if(flag) cout<<a<<endl<<b<<endl<<c<<endl<<d<<endl<<e<<endl<<z<<endl; // All above are the same. return 0; } int check(bitset<8> bs) { cout<<"this is: ["<<bs.to_ulong()<<"] " <<bs.to_string()<<endl; // bs.to_ullong() can only be used after c++11 cout<<"=================================="<<endl; cout<<"bitset size: "<<bs.size()<<"\t| " <<bs.to_string()<<endl; cout<<"has value 1: "<<bs.any()<<"\t| " <<bs.to_string()<<endl; cout<<"all value 0: "<<bs.none()<<"\t| " <<bs.to_string()<<endl; cout<<"has 1 count: "<<bs.count()<<"\t| " <<bs.to_string()<<endl; cout<<"pos[3] is 1: "<<bs.test(3)<<"\t| " <<bs.to_string()<<endl; cout<<"pos[3] to 1: "<<bs.set(3)<<"\t| " <<bs.to_string()<<endl; cout<<"pos[3] to 0: "<<bs.reset(3)<<"\t| " <<bs.to_string()<<endl; cout<<"neg pos[3]: "<<bs.flip(3)<<"\t| " <<bs.to_string()<<endl; cout<<"=================================="<<endl; cout<<"this is: ["<<bs.to_ulong()<<"] " <<bs.to_string()<<endl; return 0; } int operators() { bitset<4> foo (string("1001")); bitset<4> bar (string("0011")); cout << (foo^=bar) << endl; // 1010 (XOR,assign) cout << (foo&=bar) << endl; // 0010 (AND,assign) cout << (foo|=bar) << endl; // 0011 (OR,assign) cout << (foo<<=2) << endl; // 1100 (SHL,assign) cout << (foo>>=1) << endl; // 0110 (SHR,assign) cout << (~bar) << endl; // 1100 (NOT) cout << (bar<<1) << endl; // 0110 (SHL) cout << (bar>>1) << endl; // 0001 (SHR) cout << (foo==bar) << endl; // false (0110==0011) cout << (foo!=bar) << endl; // true (0110!=0011) cout << (foo&bar) << endl; // 0010 cout << (foo|bar) << endl; // 0111 cout << (foo^bar) << endl; // 0101 return 0; } int usage() { // init with all zeros. string cname[6] = {"red", "yellow", "green", "blue", "white", "black"}; enum Color{red, yellow, green, blue, white, black, numColors}; bitset<numColors> usedColors; // something happens usedColors.set(red); usedColors.set(blue); cout << "bitfield of used colors: " << usedColors << endl; cout << "bitfield of unused colors: " << ~usedColors << endl; // process if any color is used if (usedColors.any()) { for (int c = 0; c < numColors; ++c) { if (usedColors[Color(c)]) cout<<cname[Color(c)]<<" is used"<<endl; else cout<<cname[Color(c)]<<" is not used"<<endl; } } } int main() { bitset<8> bs(23); initial(); check(bs); //operators(); usage(); return 0; }

OUTPUT

this is: [23] 00010111
==================================
bitset size: 8  | 00010111
has value 1: 1  | 00010111
all value 0: 0  | 00010111
has 1 count: 4  | 00010111
pos[3] is 1: 0  | 00010111
pos[3] to 1: 00011111   | 00010111
pos[3] to 0: 00010111   | 00011111
neg pos[3]:  00011111   | 00010111
==================================
this is: [31] 00011111
bitfield of used colors: 001001
bitfield of unused colors: 110110
red is used
yellow is not used
green is not used
blue is used
white is not used
black is not used

0x02 Reference

相關推薦

bitsetC++方便快捷位元管理標準

0x00 前言 C++的STL向來是一個非常厲害且好用的東西, 提供了大量近乎優化到極致的解決方案,在日常程式設計或是競賽中, STL使用的嫻熟可以省去大量的時間和腦力得出非常優質的解法, 這回是我突然看見了bitset這個我不太常使用的類庫,用於狀態壓

.Netc# 讓double保留兩小數

con orm tr1 ima 一個 dbd for tin git 1、Math.Round(0.333333,2);//按照四舍五入的國際標準2、 double dbdata=0.335333; string str1=String.Format("{0:F

xshellxshell設定快捷鍵 設定Ctrl+C Ctrl+V快捷鍵為複製貼上

在使用xshell的時候,總是不能順手的進行復制貼上的操作。 那能不能設定xhsell的快捷鍵呢? 點選工具--->選項--->   選擇 鍵盤和滑鼠 選項卡--->點選編輯---->   在設定快捷鍵之前,需要先檢視一下是否已經存在了 點選&

leetcode有效的字母異詞(C、Python解答)

題目: 給定兩個字串 s 和 t ,編寫一個函式來判斷 t 是否是 s 的一個字母異位詞。 示例 1: 輸入: s = "anagram", t = "nagaram" 輸出: true 示例 2: 輸入: s = "rat", t = "car" 輸出: fal

基礎c++運算

目錄  & 與          << 左移  |  或          >> 右移 ^ 抑或 用法

20150127 ARM C語言+域聯合體

結構體位域struct Fpga{unsigned int a:1;unsigned int b:1;unsigned int c:1;}; 聯合體:多個成員共用一塊儲存空間(佔最大資料型別空間)同一時刻只能用一個成員union FPH{unsigned int p;unsigned char ch;};un

c#之繼承

none 實現 void 運算符重載 調用方法 需要 strong 靜態 顯式 一.繼承的類型   在面向對象的編程中,有兩種截然不同繼承類型:實現繼承和接口繼承   1.實現繼承和接口繼承   *實現繼承:表示一個類型派生於基類型,它擁有該基類型的所有成員字段和函

C#之集合

tab 並發集合 get spa style con 都在 src 字典  數組(http://www.cnblogs.com/afei-24/p/6738128.html)的大小是固定的。如果元素的個數是動態的,就應使用集合類。     列表(http://www.cn

C# 高性能 TCP 服務的多種實現方式

http c# del sha 開源 https tar .com targe 原文鏈接: http://www.cnblogs.com/gaochundong/p/csharp_tcp_service_models.html 開源庫: https://g

基礎C#異常處理的總結

ember -s 有效 理解 dac 十進制 reference bsp msil 一、異常處理的理解? 異常處理是指程序在運行過程中,發生錯誤會導致程序退出,這種錯誤,就叫做異常。 因此處理這種錯誤,就稱為異常處理。 二、異常處理如何操作? C# 異常處

NOI2014起床困難綜合癥 運算+貪心

困難 hide 答案 none har class gif pre 位運算 這道題先求出0和-1經過處理後的答案 具體看代碼吧 #include<cstdio> #include<cstring> #include<algorithm>

整理C#文件操作大全(SamWang)

cto read image creating ram exceptio file類 詳細 ima 文件與文件夾操作主要用到以下幾個類:   1.File類:   提供用於創建、復制、刪除、移動和打開文件的靜態方法,並協助創建 FileStre

C#獲取客戶端及服務器端主機信息及其獲取IP地址

string c# forward ria 工具 ip地址 客戶 ext add 原文發布時間為:2009-10-28 —— 來源於本人的百度文章 [由搬家工具導入]小结:1、REMOTE_ADDR 不&

C#計算兩坐標點距離

誤差 param 返回 ear 半徑 tdi col ng2 地球 //地球半徑,單位米 private const double EARTH_RADIUS = 6378137; /// <summary>

計算幾何bitsetGym - 101412G - Let There Be Light

bit pen urn 接受 eset iostream scan || names 三維空間中有一些(<=2000)氣球,一些光源(<=15),給定一個目標點,問你在移除不超過K個氣球的前提下,目標點所能接受到的最大光照。 枚舉每個光源,預處理其若要照射到光源

拓撲排序bitsetGym - 101128A - Promotions

cnblogs int turn names std amp class ans bitset 給你一張DAG,若選擇u點,則必須先選擇所有能到達其的點。問你在選擇A個點的情況下,哪些點必選;選擇B個點的情況下,哪些點必選;選擇B個點的情況下,哪些點一定不選。 選擇A個點的

分塊bitsethdu6085 Rikka with Candies

com die 過程 names -1 memset sign with pri 給你數組A和B,A B中的元素大小都不超過5w,且兩兩不同。 q次詢問,每次給你個k,問你有多少對(i,j),滿足A(i)%B(j)==k。 如題目所言模擬bitset的過程,實質上是個分塊

C語言之變量存儲類型

art 技術分享 .net ont alt enter fill img 分享 【精】C語言之變量存儲類型

收藏簡單方便的自助106短信群發工具

ima 群發 line com 短信群發 二維碼 麻煩 營銷 沒有 個人或者小規模店家要做短信營銷或者短信通知,如何選擇一家合適的短信群發平臺,需要考慮以下幾點。 1. 是否能發出去,到達率高,速度快。 根據短信內容性質不同,如果是廣告營銷,各個平臺都要進行審核。需要提供證

C++可變參數列表處理宏va_list、va_start、va_end的使用

sin 不同 struct rto snprintf 指定 cnblogs 最小 多個 VA_LIST是在C語言中解決變參問題的一組宏他有這麽幾個成員: 1)va_list型變量: #ifdef _M_ALPHA typedef struct{ char*