• 读书笔记:C++ Primer系列(8)—— 标准库类型之bitset


    题记:

      本篇继续讲述另一种重要的标准库类型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 << "****************************
    " << 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 << "******************************
    " << 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 << "*****************************
    " << 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 << "*********************************
    " << 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 << "********************************
    " << endl;  
    
        system("pause");
        return 0;  
    }  

    程序结果:

  • 相关阅读:
    day01_02.php的开发环境准备
    day01_01.了解php
    day05_01 鸡汤+内容回顾
    河北省科技信息通用调查系统需求-----------开发日志---第一天
    开发项目注意事项总结
    JavaScript学习心得
    掌握需求过程读后感
    自我检讨
    安卓开发使用get请求想服务器发送数据
    对安卓移动应用开发的学习
  • 原文地址:https://www.cnblogs.com/kkdd-2013/p/3490788.html
Copyright © 2020-2023  润新知