读书笔记:C++ Primer系列(8)—— 标准库类型之bitset
2013-12-25 15:40 Keiven_LY 阅读(387) 评论(0) 编辑 收藏 举报题记:
本篇继续讲述另一种重要的标准库类型bitset,用于位处理操作。要使用bitset类必须包含相关的头文件。
#include<bitset>
using std::bitset;
8.1 bitset对象的定义和初始化
bitset类是一种类模版,在定义bitset时,要明确bitset含有多少位,必须在尖括号中给出它的长度值,如:
bitset<32> bitvec; //该语句定义了一个变量bitvec,含有32个位的bitset对象
表8-1 初始化bitset对象的方法
8.1.1 用unsigned值初始化bitset对象
- 当用unsigned long值作为bitset对象的初始值时,该值将转化为二进制的位模式,而bitset对象中的位集作为这种位模式的副本。
- 如果bitset类型长度大于unsigned long值的二进制位数,则其余的高阶位将置为0;
- 如果bitset类型长度小于unsigned long值的二进制位数,则只使用unsigned值中的低阶位,超过bitset类型长度的高阶位将被丢弃。
例如:
bitset<16> bittemp1(0xffff);//位0...15被置为1
bitset<32> bittemp2(0xffff);//位0...15被置为1,位16....31被置为0
8.1.2 用string对象初始化bitset对象
- 当用string对象初始化bitset对象时,string对象直接表示为位模式。
- 从string对象读入位集的顺序是从右向左。
例如:
string str("1011");
bitset<32> bittemp3(str);//bittemp3位模式中的第0位和第1位都被置为1,第2位置为0,第3位置为1
注意:string对象和bitset对象之间是反向转换的:string对象的最右边字符(即下标最大的那个字符)用来初始化bitset对象的低阶位(即下标为o的位)
string str_1("1111 1110 0000 0011 01");
bitset<32> bittemp4(str_1, 5, 6); //从str_1中的第5位开始的6位赋给bittemp4,即bittemp4的位模式为:110 000
8.2 bitset对象上的相关操作
表8—2 bitset相关操作
程序清单—01
#include <iostream> #include <bitset> //标准库bitset类型头文件 #include <string> #include <cstddef> //size_t类型定义在cstddef头文件中 using std::cin; using std::cout; using std::endl; using std::bitset;//bitset的using声明 using std::string; int main() { //初始化bitset对象 bitset<16> bitvec_01; //bitvec_01有16位,每位都为0 bitset<32> bitvec_02(0xf00f);//bitvec_02是0xf00f的一个副本 //bitvec_1 is smaller than the initializer bitset<16> bitvec_1(0xffff); //bits 0...15 are set to 1 //bitvec_2 same size as initializer bitset<32> bitvec_2(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> bitvec_3(0xffff); //bits 32 through 127 initialized to zero string strval("1100"); bitset<32> bitvec_4(strval); //bitvec_4是string对象strval中含有的位串的副本 string str("1111111000000011001101"); bitset<32> bitvec_5(str, 5, 4); //4 bits starting at str[5], 1100 bitset<32> bitvec_6(str, str.size()-4); //use last 4 characters //测试初始化后的值 cout << "*********0、初始化*********" << endl; cout << "bitvec_01: " << bitvec_01 << endl; cout << "bitvec_02: " << bitvec_02 << endl; cout << "bitvec_1: " << bitvec_1 << endl; cout << "bitvec_2: " << bitvec_2 << endl; cout << "bitvec_3: " << bitvec_3 << endl; cout << "bitvec_4: " << bitvec_4 << endl; cout << "bitvec_5: " << bitvec_5 << endl; cout << "bitvec_6: " << bitvec_6 << endl; cout << "****************************\n" << endl; //bitset对象上的操作 //1、测试整个bitset对象 bool is_set_1 = bitvec_01.any(); //false, all bits are zero bool is_set_2 = bitvec_02.any(); //true, 0xf00f bool is_not_set_1 = bitvec_01.none(); //true, all bits are zero bool is_not_set_2 = bitvec_02.none(); //false, 0xf00f size_t bits_set_1 = bitvec_01.count(); //returns number of bits that are on size_t bits_set_2 = bitvec_02.count(); //returns number of bits that are on size_t sz_1 = bitvec_01.size(); //returns 16 size_t sz_2 = bitvec_02.size(); //returns 32 cout << "****1、测试整个bitset对象****" << endl; cout << "is_set_1: " << is_set_1 << endl; //0 cout << "is_set_2: " << is_set_2 << endl; //1 cout << "is_not_set_1: " << is_not_set_1 << endl; //1 cout << "is_not_set_2: " << is_not_set_2 << endl; //0 cout << "bits_set_1: " << bits_set_1 << endl; //0 cout << "bits_set_2: " << bits_set_2 << endl; //8 cout << "sz_1: " << sz_1 << endl; //16 cout << "sz_2: " << sz_2 << endl; //32 cout << "******************************\n" << endl; //2、访问bitset对象中的位 cout << "***2、访问bitset对象中的位***" << endl; cout << "bitvec_01: " << bitvec_01 << endl; for(size_t index=0; index != bitvec_01.size(); ++index) {//通过下标将二进制位都置为1 bitvec_01[index] = 1; } if(bitvec_01.test(0)) {//用test操作测试某个位是否为1 cout << "bitvec_01: " << bitvec_01 << endl; } bitvec_01.reset(); //重置为0 cout << "bitvec_01: " << bitvec_01 << endl; for(size_t index=0; index!=bitvec_01.size(); ++index) {//用set操作将二进制位置为1 bitvec_01.set(index); } if(bitvec_01[1]) {//测试下标操作符的返回值,测试某个位是否为1 cout << "bitvec_01: " << bitvec_01 << endl; } cout << "*****************************\n" << endl; //3、对整个bitset对象进行设置 cout << "***3、对整个bitset对象进行设置***" << endl; cout << "bitvec_01: " << bitvec_01 << endl; bitvec_01.reset(); //set all the bits to 0 cout << "bitvec_01: " << bitvec_01 << endl; bitvec_01.set(); //set all the bits to 1 cout << "bitvec_01: " << bitvec_01 << endl; bitvec_01.flip(0); //reverses value of first bit cout << "bitvec_01: " << bitvec_01 << endl; bitvec_01[0].flip(); //also reverses the first bit cout << "bitvec_01: " << bitvec_01 << endl; bitvec_01.flip(); //reverses value of all bits cout << "bitvec_01: " << bitvec_01 << endl; cout << "*********************************\n" << endl; //4、获取bitset对象的值 cout << "*****4、获取bitset对象的值*****" << endl; unsigned long ulong = bitvec_01.to_ulong(); //returns 0 cout << "ulong: " << ulong <<endl; ulong = bitvec_01.set().to_ulong(); //returns 65535 (bitvec_01 is a 16-bits bitset object.) cout << "ulong: " << ulong <<endl; cout << "********************************\n" << endl; system("pause"); return 0; }
程序结果: