程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C++標准庫 bitset,標准庫bitset

C++標准庫 bitset,標准庫bitset

編輯:C++入門知識

C++標准庫 bitset,標准庫bitset


本文地址:http://www.cnblogs.com/archimedes/p/cpp-bitset.html,轉載請注明源地址。

有些程序要處理二進制位的有序集,每個位可能包含 0(關)1(開)值。位是用來保存一組項或條件 的 yes/no 信息(有時也稱標志)的簡潔方法。標准庫提供的 bitset 類簡化了位集的處理。要使用 bitset 類就必須包含相關的頭文件。在本書提供的例子中,假設都使用 std::bitset 的using聲明:

#include <bitset>
using std::bitset;

bitset 對象的定義和初始化

下表列出了 bitset 的構造函數。類似於 vector,bitset 類是一種類模板;而與 vector 不一樣的 是 bitset 類型對象的區別僅在其長度而不在其類型。在定義 bitset 時,要明確 bitset 含有多少位,須在尖括號內給出它的長度值:

bitset<n> b; b 有 n 位,每位都 0 bitset<n> b(u); b 是 unsigned long 型 u 的一個副本 bitset<n> b(s); b 是 string 對象 s 中含有的位串的副本 bitset<n> b(s, pos, n); b 是 s 中從位置 pos 開始的; n 個位的副本。
bitset<32> bitvec; // 32 bits, all zero

給出的長度值必須是常量表達式。正如這裡給出的,長度值值必須定義為整型字面值常量或是已 用常量值初始化的整型的 const 對象。這條語句把 bitvec 定義為含有 32 個位的 bitset 對象。和 vector 的元素一樣,bitset 中的位是沒有命名的,程序員只能按位置來訪問。位集合的位置編號從 0 開始,因此,bitvec 的位序是從 0 到 31。 以 0 位開始的位串是低階位(low-order),以 31 位結束的位串是高階位( high-order)。

用 unsigned 值初始化 bitset 對象

當用 unsigned long 值作為 bitset 對象的初始值時,該值將轉化為二進制的位模式。而 bitset 對象中 的位集作為這種位模式的副本。如果 bitset 類型長度大於 unsigned long 值的二進制位數,則其余的高 階位將置為 0;如果 bitset 類型長度小於 unsigned long 值的二進制位數,則只使用 unsigned 值中的 低階位,超過 bistset 類型長度的高階位將被丟棄。

在 32 位 unsigned long 的機器上,十六進制值 0xffff 表示為二進制位就是十六個 1 和十六個 0(每 個 0xf 可表示為 1111)。可以用 0xffff 初始化 bitset 對象:

// bitvec1 is smaller than the initializer
 bitset<16> bitvec1(0xffff); // bits 0 ... 15 are set to 1
 // bitvec2 same size as initializer
 bitset<32> bitvec2(0xffff); // bits 0 ... 15 are set to 1; 16 ... 31 are 0
 // on a 32-bit machine, bits 0 to 31 initialized from 0xffff
 bitset<128> bitvec3(0xffff); // bits 32 through 127 initialized to zero

上面的三個例子中,0 到 15 位都置為 1。由於 bitvec1 位數少於 unsigned long 的位數,因 此 bitvec1 的初始值的高階被丟棄。bitvec2 和 unsigned long 長度相同,因此所有位正好放置了初始值。bitvec3 長度大於 32,31 位以上的高階位就被置為 0。

用 string 對象初始化 bitset 對象
當用 string 對象初始化 bitset 對象時,string 對象直接表示為位模式。從 string 對象讀入位集的順 序是從右向左(from right to left):

string strval("1100");
bitset<32> bitvec4(strval);

bitvec4 的位模式中第 2 和 3 的位置為 1,其余位置都為 0。如果 string 對象的字符個數小 於 bitset 類型的長度,則高階位置為 0。

string 對象和 bitsets 對象之間是反向轉化的:string 對象的最右邊字符(即下標最大的那個字符)用來初始化 bitset 對象的低階位(即下標為 0 的位)。當用string對象初始化 bitset 對象時,記住這一差別很重要。

不一定要把整個 string 對象都作為 bitset 對象的初始值。相反,可以只用某個子串作為初始值:

string str("1111111000000011001101");
bitset<32> bitvec5(str, 5, 4); // 4 bits starting at str[5], 1100
bitset<32> bitvec6(str, str.size() - 4); // use last 4 characters

這裡用 str 從 str[5] 開始包含四個字符的子串來初始化 bitvec5。照常,初始化 bitset 對象時總是從子串最右邊結尾字符開始的,bitvec5 的從 3 到 0 的二進制位置為 1100 ,其他二進制位都置為 0。如果 省略第三個參數則意味著取從開始位置一直到 string 末尾的所有字符。本例中,取出 str 末尾的四位來 對 bitvec6 的低四位進行初始化。bitvec6 其余的位初始化為 0。這些初始化過程的圖示如下:

bitset 對象上的操作

多種 bitset 操作( 表 3.7)用來測試或設置 bitset 對象中的單個或多個二進制位。

測試整個 bitset 對象
如果 bitset 對象中有一個或幾個二進制位置為 1,則 any 操作返回 true,也就是說,其返回值等於 1; 相反,如果 bitset 對象中二進制位全為 0,則 none 操作返回 true。

bitset<32> bitvec; // 32 bits, all zero
bool is_set = bitvec.any(); // false, all bits are zero
bool is_not_set = bitvec.none(); // true, all bits are zero

如果需要知道置為 1 的二進制位的個數,可以使用 count 操作,該操作返回置為 1 的二進制位的個數:

size_t bits_set = bitvec.count(); // returns number of bits that are on

count 操作的返回類型是標准庫中命名為 size_t 類型。size_t 類型定義在 cstddef 頭文件中,該文件 是 C 標准庫的頭文件 stddef.h 的 C++ 版本。它是一個與機器相關的 unsigned 類型,其大小足以保證存 儲內在中對象的大小。
與 vector 和 string 中的 size 操作一樣,bitset 的 size 操作返回 bitset 對象中二進制位的個數, 返回值的類型是 size_t:: 

size_t sz = bitvec.size(); // returns 32

訪問 bitset 對象中的位
可以用下標操作符來讀或寫某個索引位置的二進制位,同樣地,也可以用下標操作符測試給定二進制位的值 或設置某個二進制們的值:

// assign 1 to even numbered bits
 for (int index = 0; index != 32; index += 2)
 bitvec[index] = 1;

上面的循環把 bitvec 中的偶數下標的位都置為 1。
除了用下標操作符,還可以用 set;、test 和 reset 操作來測試或設置給定二進制位的值:

// equivalent loop using set operation
 for (int index = 0; index != 32; index += 2)
 bitvec.set(index);

為了測試某個二進制位是否為 1,可以用 test 操作或者測試下標操作符的返回值:

if (bitvec.test(i))
 // bitvec[i] is on
 // equivalent test using subscript
 if (bitvec[i])
 // bitvec[i] is on

如果下標操作符測試的二進制位為 1,則返回的測試值的結果為 true,否則返回 false。
對整個 bitset 對象進行設置
set 和 reset 操作分別用來對整個 bitset 對象的所有二進制位全置 1 和全置 0:

bitvec.reset(); // set all the bits to 0.
bitvec.set(); // set all the bits to 1

flip 操作可以對 bitset 對象的所有位或個別位取反

bitvec.flip(0); // reverses value of first bit
bitvec[0].flip(); // also reverses the first bit
bitvec.flip(); // reverses value of all bits

獲取 bitset 對象的值
to_ulong 操作返回一個 unsigned long 值,該值與 bitset 對象的位模式存儲值相同。僅當 bitset 類型 的長度小於或等於 unsigned long 的長度時,才可以使用 to_ulong 操作:

unsigned long ulong = bitvec3.to_ulong();
cout << "ulong = " << ulong << endl;

to_ulong 操作主要用於把 bitset 對象轉到 C 風格或標准 C++ 之前風格的程序上。如果 bitset 對象包 含的二進制位數超過 unsigned long 長度, 將會產生運行時異常。

輸出二進制位
可以用輸出操作符輸出 bitset 對象中的位模式:

bitset<32> bitvec2(0xffff); // bits 0 ... 15 are set to 1;  16 ... 31 are 0
cout << "bitvec2: " << bitvec2 << endl;

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved