1. 程式人生 > >C++標準庫中bitset型別

C++標準庫中bitset型別

雖然在C++的基本型別中,似乎沒有二進位制這個重要的型別,但是在C++標準庫中卻提供了能夠處理二進位制位的有序集合型別,這就是

bitset型別,使用該型別時需要先包含該標頭檔案並進行宣告:

#include <bitset>
using namespace std;

該型別儲存的是一個有序的二進位制資料的集合,該集合的長度值需要在構造該型別時在尖括號中給出(因為該型別實際上也是一種類模版)。

一、bitset型別的初始化方式
一共有四種初始化方式:
For Example:

//bitset物件的初始化
	//方法一
	bitset<32> b; //直接構造一個空物件,其中的每一位都預設為0
	//方法二
	unsigned long a =32;
	bitset<32> b1(a);  //構造成一個unsigned long型別的二進位制副本
	//方法三
	string a1("10001100001111001");
	bitset<17> b2(a1); //構造成一個含有二進位制位串的副本
	//方法四
	bitset<10> b3(a1,1,10);//構造成從a1的1位置開始的10個位的副本

二、對於該二進位制集合的訪問方式

只能以位置的方式來訪問其中每一個二進位制元素,即以下標的方式來訪問,但需注意的是像陣列集合一樣,該集合的下標也是從0開始的。

 //按照下標的位置來訪問該二進位制集合
	for(int i = 0;i<15;i++)
	{
		cout<<b2[i]<<flush;//輸出:100111100001100
	}

三、輸出二進位制位
與一般容器集合不同的是bitset二進位制集合可以直接用輸出操作符進行正題輸出。
 cout<<"b:"<<b<<endl;//輸出:00000000000000000000000000000000
	cout<<"b1:"<<b1<<endl;//輸出:00000000000000000000000000100000
	cout<<"b2:"<<b2<<endl;//輸出:10001100001111001
	cout<<"b3:"<<b3<<endl;//輸出:0001100001

四、對於bitset物件的值的獲取

有兩種獲取方式:分別是:轉換成一個unsigned long的整數型別  (呼叫成員函式:.to_ulong())
                        轉換成一個包含該集合所有二進位制位的字串    (呼叫成員函式:.to_string())

   string str("0001110001");
   bitset<10> bitver(str);
   //轉換成一個unsigned long的整數型別 
   unsigned long ul = bitver.to_ulong();//輸出113
   cout<<ul<<endl;
   //轉換成一個包含該集合所有二進位制位的字串
   string ss = bitver.to_string();//輸出0001110001
   cout<<ss<<endl;

五、利用內建成員函式對真個bitset物件進行設定
.set() //將所有的二進位制位都設定為1
.reset() //將所有的二進位制位都設定為0
.size() //返回集合的大小
.set[pos] //將pos位置的二進位制位設定為1
.reset[pos]  //將pos位置的二進位制位設定為0
.flip() //將所有的二進位制位都取反
.flip(pos)   //將pos位置的二進位制位取反
//。。。。

六、bitset集合最重要的特性是此類也支援內建的位操作符

但須注意的是:bitset集合按位運算的物件只能是也是一個bitset集合,而不能與一個整數進行按位運算。
For Example:

#include<iostream>
#include<bitset>
#include<string>
#include<vector>
using namespace std;
int main()
{
   string str("0001110001");
   bitset<10> bitver(str);
   //取反
   bitver =  ~bitver;
   cout<<bitver<<endl;//輸出1110001110
   //左移兩位
   bitset<10> b1 = bitver<<2;
   cout<<"b1"<<b1<<endl;//輸出1000111000
   //右移兩位
   bitset<10> b2 =  bitver>>2;
   cout<<"b2"<<b2<<endl;//輸出0011100011
   //按位與&
   unsigned long  a = 1;
   bitset<10> a1(a);
   cout<<"a1"<<a1<<endl;//輸出0000000001
   bitset<10> b3 =  bitver & a1; 
   cout<<"b3"<<b3<<endl;//輸出0000000000
   return 0;
}