代码改变世界

读书笔记: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;  
}  

程序结果: