【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
相關推薦
【bitset】C++方便快捷的位元位管理標準庫
0x00 前言 C++的STL向來是一個非常厲害且好用的東西, 提供了大量近乎優化到極致的解決方案,在日常程式設計或是競賽中, STL使用的嫻熟可以省去大量的時間和腦力得出非常優質的解法, 這回是我突然看見了bitset這個我不太常使用的類庫,用於狀態壓
【.Net】c# 讓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
【xshell】xshell設定快捷鍵 設定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>
【計算幾何】【bitset】Gym - 101412G - Let There Be Light
bit pen urn 接受 eset iostream scan || names 三維空間中有一些(<=2000)氣球,一些光源(<=15),給定一個目標點,問你在移除不超過K個氣球的前提下,目標點所能接受到的最大光照。 枚舉每個光源,預處理其若要照射到光源
【拓撲排序】【bitset】Gym - 101128A - Promotions
cnblogs int turn names std amp class ans bitset 給你一張DAG,若選擇u點,則必須先選擇所有能到達其的點。問你在選擇A個點的情況下,哪些點必選;選擇B個點的情況下,哪些點必選;選擇B個點的情況下,哪些點一定不選。 選擇A個點的
【分塊】【bitset】hdu6085 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*