类可以将其(非静态)数据成员定义成位域,在一个位域中含有一定数量的二进制位。当一个程序需要向其他程序或硬件设备传递二进制数据时,通常会用到位域+。

    1. // 位域的类型必须是整型或枚举类型。
    2. // 因为带符号位域的行为是由具体实现确定的,所以在通常情况下我们使用无符号类型保存一个位域。
    3. typedef unsigned int Bit;
    4. class File {
    5. Bit mode:2; // mode占2位
    6. Bit modified:1; // modified占1位
    7. Bit prot_owner:3; // prot_owner占3位
    8. Bit prot_group:3; // prot_group占3位
    9. Bit protworld:3; // prot_world占3住
    10. // 位域在内存中的布局与机器相关
    11. // 这五个连续的位域可能压缩在一个unsigned int中
    12. // 是否能压缩到一个整数中以及如何压缩是与机器相关的。
    13. // File的操作和数据成员
    14. public:
    15. enum modes{ // 文件类型以八进制的形式表示
    16. READ = 01,
    17. WRITE = 02,
    18. EXECUTE = 03
    19. };
    20. File &open(modes);
    21. void close();
    22. void write();
    23. bool isRead() const;
    24. void setWrite();
    25. };
    26. void File::write(){
    27. modified = 1;
    28. }
    29. void File::close(){
    30. if (modified)
    31. ......
    32. }
    33. // 通常使用内置的位运算符操作超过1位的位域
    34. File &File::open(File::modes m)
    35. mode |= READ; // 按默认方式设置READ
    36. ......
    37. if (m & WRITE) // 如果打开了READ和WRITE
    38. ...... // 按照读/写方式打开文件
    39. return *this ;
    40. }
    41. // 如果一个类定义了位域成员,则它通常也会定义一组内联的成员函数以检验或设置位域的值
    42. inline bool File::isRead() const{
    43. return mode & READ;
    44. }
    45. inline void File::setWrite() {
    46. mode |= WRITE;
    47. }

    举个实际例子(磁盘寄存器),下面是一个磁盘寄存器的定义。
    image.pngimage.png