一、bitset的定義
類似於vector後面<>中的數據類型,bitset<>括號中記錄了長度。
#include <iostream>
#include<bitset>
#include<string>
using namespace std;
int main()
{
//1
bitset<32> i; //初始化一個32位全部爲0的數(注意<>內長度必須爲1.整形常量 2.已用常量初始化的const對象 )
//i中的位序是從0到31開始
//2
unsigned long i;
bitset<32> j(i)//用i初始化j
//3
string s;
bitset<32> k(s);//k是string對象s中含有的位串的副本
//4
bitset<32> m(s,pos,n);//m是從位置pos開始的n個位的副本
}
二、bitset的初始化
1、用unsigned值初始化
規則:
如果bitset類型長度大於unsigned long值的二進制位數,則其餘的高階位置爲0;
如果bitet類型長度小於unsigned long值的二進制位數,則只使用unsigned值中的低階位,超過bitet類型長度的高階位將被丟棄。
//例子0xffff在32位機上爲 1111 1111 1111 1111 0000 0000 0000 0000
bitset<16> a(0xffff); //a爲16位全爲1,超出部分的0丟棄
bitset<32> b(0xffff);//b的0到15位全是1,剩下16到31是0,bitset位數32與unsigned long 長度相同
bitset<64> c(0xffff);//bitset爲64位大於unsigned long 32, 31到63自動置零
2、用string初始化bitset
規則
從string對象讀入位集的順序是從右向左
string str("1101");
bitset<32> a(str); //a中順序爲1011000..00,超出的位全補零
string s("111111100000111101010111");
bitset<32> b(s,5,4); //從s[5]開始讀4位,爲1100
bitset<32> c(s,s.size()-4); //讀後四位(從s[s.size()-4]一直讀到結束
三、bitset的操作
bitset<32> a("10010010");
a.any();//a中是否有1,返回bool變量,有1爲true,全爲0返回false
a.none();//a中是否沒1,true爲全0,false爲至少有一個1
a.count();//返回a中1的個數
a.size();//返回二進制位數
int k=a[i];//訪問a中i處的位
a.set();//將a全置1;
a.set(i);//將a中第i位置1;
a.reset();//將a全置0;
a.reset(i);//將a中第i位置0;
a.flip();//全位取反
a.flip(i);//i位取反
a.to_ulong();//返回a中二進制數的unsigned long數
os<<a;//將a輸出到os流
附錄:
一個例子
#include <iostream>
#include<string>
#include<stdexcept>
#include<bitset>
using namespace std;
int main()
{
bitset<100> a;
a.set();
//a.to_ulong(); //在try前的錯誤操作不會拋出異常
try{
a.to_ulong(); //導致溢出的操作
}
catch (exception err){ //處理操作
cout << err.what() << ": 溢出" << endl;
}
//a.to_ulong();//try後的錯誤操作會拋出異常
unsigned long k=a.to_ulong();
}