一、bitset簡介
bitset是C++ STL庫中的一個類,用於存儲二進位位的布爾值,提供了簡單的位操作函數。bitset對象可以控制每個位的值為0或1。可以看做是一種高效的點陣圖。
#include using namespace std;
二、bitset的常規用法
1、創建bitset變數
創建一個bitset變數,參數表示變數長度,即二進位位數。默認構造函數構造的bitset變數所有位的值都是0。通過構造函數bitset(int n, unsigned long value)可以構造一個值為value的n位bitset對象。
bitset bits; //創建一個長度為8的bitset對象,所有位初始值都為0 bitset bits1(0b10101010); //創建一個長度為8的bitset對象,數值為0b10101010
2、訪問bitset變數
使用[]運算符或者字元串形式的下標來訪問bitset變數的對應位,如bits[2]或bits[「010」]表示訪問第3位,下標從0開始。
bitset bits(0b10101010); cout<<bits[0]<<" "<<bits[2]<<" "<<bits[7]<<endl; //輸出 0 1 0
3、bitset變數輸入輸出
bitset變數可以通過iostream庫中的輸入輸出函數使用,bitset對象可以用作輸出流和輸入流。
bitset bits(0b10101010); cout<<bits<>bits; //輸入一個二進位數到bits
4、bitset變數設置和清除
使用set()方法可以將某一位設置為1,reset()方法可以將某一位設置為0。
bitset bits; bits.set(2); //將第3位設置為1 bits.reset(1); //將第2位設置為0
5、bitset變數的位運算
bitset對象提供了基本的位運算函數,包括按位與、按位或、按位異或、按位取反。可以使用與、或、異或、取反運算符或者對應的成員函數進行位運算。
bitset a(0b11001100); bitset b(0b10101010); bitset c = a & b; //按位與 bitset d = a | b; //按位或 bitset e = a ^ b; //按位異或 bitset f = ~a; //按位取反
三、bitset的高級用法
1、bitset對象的大小控制
使用size()方法可以獲取bitset對象的位數,max_size()方法可以獲取bitset對象所能包含的最大位數。使用count()方法可以獲取bitset中1的數量,flip()方法可以將所有位取反。
bitset bits(0b10101010); cout<<bits.size()<<endl; //輸出8,bits對象包含8個二進位位 cout<<bits.count()<<endl; //輸出4,bits對象中1的數量為4 bits.flip(); //將所有位取反
2、bitset對象的截取和連接
使用to_ulong()和to_ullong()方法可以將bitset對象轉換為unsigned long和unsigned long long類型。使用to_string()方法可以將bitset對象轉化為string類型。使用operator<>可以將bitset對象截取或連接。兩個bitset對象可以拼接成一個較長的對象。
bitset a(0b1010); bitset b(0b11110000); unsigned long c = a.to_ulong(); cout<<c<<endl; //輸出10,將a轉換為unsigned long類型 string d = a.to_string(); cout<<d<<endl; //輸出「1010」,將a轉換為string類型 bitset e = (a<<8) | b; cout<<e<<endl; //輸出「101011110000」 用a左移8位的結果與b拼接成一個12位的bitset對象
四、bitset的應用
bitset可以用於大量的位運算問題,如壓位DP、遊戲中的狀態存儲、壓縮演算法、密碼學等方面。
代碼示例
#include #include using namespace std; int main() { //常規用法 bitset bits; //創建一個長度為8的bitset對象,所有位初始值都為0 bitset bits1(0b10101010); //創建一個長度為8的bitset對象,數值為0b10101010 cout<<bits1[0]<<" "<<bits1[2]<<" "<<bits1[7]<<endl; //輸出 0 1 0 bitset bits2(0b10101010); cout<<bits2<>bits2; //輸入一個二進位數到bits2 bitset bits3(0b10101010); bits3.set(2); //將第3位設置為1 bits3.reset(1); //將第2位設置為0 cout<<bits3<<endl; //輸出10101100 bitset a(0b11001100); bitset b(0b10101010); bitset c = a & b; //按位與 bitset d = a | b; //按位或 bitset e = a ^ b; //按位異或 bitset f = ~a; //按位取反 cout<<c<<" "<<d<<" "<<e<<" "<<f<<endl; //輸出「10001000 11101110 01100110 00110011」 //高級用法 bitset bits4(0b10101010); cout<<bits4.size()<<endl; //輸出8,bits對象包含8個二進位位 cout<<bits4.count()<<endl; //輸出4,bits對象中1的數量為4 bits4.flip(); //將所有位取反 cout<<bits4<<endl; //輸出「01010101」 bitset a1(0b1010); bitset b1(0b11110000); unsigned long c1 = a1.to_ulong(); cout<<c1<<endl; //輸出10,將a1轉換為unsigned long類型 string d1 = a1.to_string(); cout<<d1<<endl; //輸出「1010」,將a1轉換為string類型 bitset e1 = (a1<<8) | b1; cout<<e1<<endl; //輸出「101011110000」 用a1左移8位的結果與b1拼接成一個12位的bitset對象 return 0; }
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/191132.html