类可以将其(非静态)数据成员定义成位域,在一个位域中含有一定数量的二进制位。当一个程序需要向其他程序或硬件设备传递二进制数据时,通常会用到位域+。
// 位域的类型必须是整型或枚举类型。
// 因为带符号位域的行为是由具体实现确定的,所以在通常情况下我们使用无符号类型保存一个位域。
typedef unsigned int Bit;
class File {
Bit mode:2; // mode占2位
Bit modified:1; // modified占1位
Bit prot_owner:3; // prot_owner占3位
Bit prot_group:3; // prot_group占3位
Bit protworld:3; // prot_world占3住
// 位域在内存中的布局与机器相关
// 这五个连续的位域可能压缩在一个unsigned int中
// 是否能压缩到一个整数中以及如何压缩是与机器相关的。
// File的操作和数据成员
public:
enum modes{ // 文件类型以八进制的形式表示
READ = 01,
WRITE = 02,
EXECUTE = 03
};
File &open(modes);
void close();
void write();
bool isRead() const;
void setWrite();
};
void File::write(){
modified = 1;
}
void File::close(){
if (modified)
......
}
// 通常使用内置的位运算符操作超过1位的位域
File &File::open(File::modes m)
mode |= READ; // 按默认方式设置READ
......
if (m & WRITE) // 如果打开了READ和WRITE
...... // 按照读/写方式打开文件
return *this ;
}
// 如果一个类定义了位域成员,则它通常也会定义一组内联的成员函数以检验或设置位域的值
inline bool File::isRead() const{
return mode & READ;
}
inline void File::setWrite() {
mode |= WRITE;
}
举个实际例子(磁盘寄存器),下面是一个磁盘寄存器的定义。