zoukankan      html  css  js  c++  java
  • C++中的位域(bit-filed):一种节省空间的成员

    转载自:http://www.cppblog.com/suiaiguo/archive/2009/07/16/90211.html

    有一种被称为位域(bit-field) 的特殊的类数据成员,它可以被声明用来存放特定数目的位。位域必须是有序数据类型。它可以有符号也可以无符号。例如:

    class File {
    // 
    unsigned int modified : 1; // 位域 (bit-field)
    };
    View Code

    位域标识符后面跟有一个冒号,然后是一个常量表达式指定位数。例如modified
    是一个只有一位构成的位域。
       在类体中相邻定义的位域,如果可能的话,它们会被放在同一个整数的连续位中,并以此提供空间压缩。例如,在下列声明中5
    个位域被存储在单个unsigned int 中,它首先与位域mode 相关联。

    typedef unsigned int Bit;
    class File {
    public:
    Bit mode: 2;
    Bit modified: 1;
    Bit prot_owner: 3;
    Bit prot_group: 3;
    Bit prot_world: 3;
    // 
    };
    View Code

    位域在内存中的位置是从低位向高位放置的,比如mode在Bit的最低两位(二进制数0b0000000000000011中两个1的位置)。
       对于位域的访问方式与其他类数据成员相同。例如,类的私有位域只能在类的成员函数和友元中被访问:

    void File::write()
    {
    modified = 1;
    // 
    }
    void File::close()
    {
    if ( modified )
    //  内容从略
    }
    View Code

    下面的例子说明了怎样使用大于1 位的位域

    enum { READ = 01, WRITE = 02 }; // 文件模式
    int main() {
    File myFile;
    myFile.mode |= READ;
    if ( myFile.mode & READ )
    cout << "myFile.mode is set to READ
    ";
    }
    View Code

    通常情况下我们会定义一组inline 成员函数,来测试每个位域成员的值。例如,类File可以定义成员isRead()和isWrite()

    inline int File::isRead() { return mode & READ; }
    inline int File::isWrite() { return mode & WRITE; }
    if ( myFile.isRead() ) /**//*  */
    View Code

    有了这些成员函数,现在位域可以被声明为类File 的私有成员。
       由于取地址操作符&
    不能被应用在位域上,所以也没有能指向类的位域的指针。位域也不能是类的静态成员。

       C++标准库提供了一个bitset
    类模板,它可以辅助操纵位的集合。在可能的情况下应尽可能使用它来取代位域。

    ——现在的努力是为了小时候吹过的牛B!!
  • 相关阅读:
    2021/9/20 开始排序算法
    快速排序(自己版本)
    2021/9/17(栈实现+中后缀表达式求值)
    2021/9/18+19(中缀转后缀 + 递归 迷宫 + 八皇后)
    20212021/9/13 稀疏数组
    2021/9/12 线性表之ArrayList
    开发环境重整
    Nginx入门
    《财富的帝国》读书笔记
    Linux入门
  • 原文地址:https://www.cnblogs.com/pingge/p/3315852.html
Copyright © 2011-2022 走看看