浅析 位域
来源:互联网 发布:网络培训的心得体会 编辑:程序博客网 时间:2024/06/03 17:57
可以声明一种特殊的类数据成员,称为位域(bit-field),来保存特定的位数。当程序需要将二进制数据传递给另一程序或硬件设备的时候,
通常使用位域。
注解:位域在内存中的布局是机器相关的。
位域必须是整型数据类型,可以说是signed或unsigned 。通过在成员名后面接一个冒号以及指定位数的常量表达式,指出成员是一个位域:
typedif unsigned int Bit;
class File
{
Bit mode:2;
Bit modefiled:1;
Bit prot_owner:3;
Bit prot_group:3;
Bit prot_world:3;
//..
};
mode位域有两个位,modified 只有一位,其他每个成员有三个位。(如果可能)将类定义体中按相邻次序定义中的位域压缩在同一整数的相邻位,
从而提供存储压缩。例如:在前面的声明中,5个位域将存储在一个首先与位域mode关联的unsigned int 中。位是否压缩到整数以及如何压缩与机器
有关。
通常最好将位域设为unsigned 类型。存储在signed 类型中的位域 的行为由实现定义
使用位域
用与类的其他数据成员相同的方式访问位域。例如:作为类的private成员的位域只能从那个成员函数的定义和类的友元中访问:
void File::write()
{
modified=1;
//...
}
void File::close()
{
if(modified)
//..save contents
}
通常使用内置按位操作符操作超过一位的位域:
enum {READ=01,WRITE =02};//File modes
int main()
{
File myFile;
myFile.mode |=READ;//set the READ bit
if(myFile.mode & READ)
{
cout<<"myFile.mode READ is set \n";
}
}
定义了位域成员的类通常也定义一组内联成员函数来测试和设置位域的值。例如:File类可以定义成员isRead和isWrite:
inline int File::isRead(){return mode & READ;}
inline int File::isWrite(){return mode & WRITE;}
有了这些成员函数,现在就可以将位域声明为File类的私有成员了
地址操作符(&)不能应用于位域,所以不可能有引用类位域的指针,位域也不能是类的静态成员。
通常使用位域。
注解:位域在内存中的布局是机器相关的。
位域必须是整型数据类型,可以说是signed或unsigned 。通过在成员名后面接一个冒号以及指定位数的常量表达式,指出成员是一个位域:
typedif unsigned int Bit;
class File
{
Bit mode:2;
Bit modefiled:1;
Bit prot_owner:3;
Bit prot_group:3;
Bit prot_world:3;
//..
};
mode位域有两个位,modified 只有一位,其他每个成员有三个位。(如果可能)将类定义体中按相邻次序定义中的位域压缩在同一整数的相邻位,
从而提供存储压缩。例如:在前面的声明中,5个位域将存储在一个首先与位域mode关联的unsigned int 中。位是否压缩到整数以及如何压缩与机器
有关。
通常最好将位域设为unsigned 类型。存储在signed 类型中的位域 的行为由实现定义
使用位域
用与类的其他数据成员相同的方式访问位域。例如:作为类的private成员的位域只能从那个成员函数的定义和类的友元中访问:
void File::write()
{
modified=1;
//...
}
void File::close()
{
if(modified)
//..save contents
}
通常使用内置按位操作符操作超过一位的位域:
enum {READ=01,WRITE =02};//File modes
int main()
{
File myFile;
myFile.mode |=READ;//set the READ bit
if(myFile.mode & READ)
{
cout<<"myFile.mode READ is set \n";
}
}
定义了位域成员的类通常也定义一组内联成员函数来测试和设置位域的值。例如:File类可以定义成员isRead和isWrite:
inline int File::isRead(){return mode & READ;}
inline int File::isWrite(){return mode & WRITE;}
有了这些成员函数,现在就可以将位域声明为File类的私有成员了
地址操作符(&)不能应用于位域,所以不可能有引用类位域的指针,位域也不能是类的静态成员。
- 浅析 位域
- 32位的SSDT表结构浅析
- ARM 64位处理器架构ARMv8技术浅析
- ARM 64位处理器架构ARMv8技术浅析
- 浅析C语言结构体及位段
- TCP定时器 和 URG.PSH版本控制位 浅析
- 位域
- 位域
- 位域
- 位域
- 位域
- 位域
- 位域
- 位域
- 位域
- 位域
- 位域
- 位域
- PHP plist 生成器
- cocos2d-x学习日志(4) -- CCCallFunc系列函数的应用
- IT时代论坛简介
- Android静态变量的生命周期 简单介绍
- 如何在linux内核中调用用户空间的程序
- 浅析 位域
- Eclipse快捷键 今天又学会了几个不常用的 收藏了
- 按键设备驱动—我的学习资料
- 资深淘宝店主与您分享淘宝经验
- 5.1 队列的数组实现
- 黑马程序员--入门基础三
- 《黑客与画家》关于原型设计的精彩论述
- java程序获得SqlServer数据表的表结构
- 让我不再害怕驱动