TAG:位运算,位段
TEXT:
计算机在处理有符号数时,通过其最高位来标识当前数的正负。但是在逻辑表达式及其运算中,真与假是通过
一个16位整数来描述的,其中有15位的二进制数位的空间因没有用途而浪费。如何来充分利用计算机存储空间是软件工程中一个很重要的课题。例如,在计算机
网络通信中,TCP/IP协议中IP协议数据包头部的格式如表(12-2)所示。
0
15 16 31
版本 首部长度 服务类型 数据包长度
标示
MP 碎片偏移
生存时间 协议 首部校验和
源IP地址
目的IP地址
选项
表12-2: IP协议数据包头部格式
如何来表达此类数据信息,在本节中介绍。
在C语言中允许为结构体的每个成员分配特定的存储空间,这种以位为单位的成员称为位段。为了描述在本节开头介绍的IP协议数据结构,可以定义如下的结构
体。
Struct IPData
{
unsigned Version:4,
unsigned Headlength: 4,
unsigned ServiceType: 8,
unsigned Length: 16,
usigned Tag: 16,
...
}
其中符号“:”后的整数常量表示此成员变量占用的位数。此结构体说明,Version占4位,因此表达的最大版本号位15;Length占16位,说明数
据包的最大长度为65535字节。
其在内存中存储格式如下(表12-3):
0
15 16 31
版本 首部长度 服务类型 数据包长度
表12-3 IP协议数据包头部格式
一般来讲,各个位段的长度没有限制,但是要注意位段的组织与存储方式。在使用位段的时候请注意如下问题:
位段成员必须为整型数据,包括有符号数和无符号数;位段的长度为大于等于零的整数常量。
位段长度为零的主要目的是使得下一成员从下一存储单元开始存放,本单元没有用完的单元空闲。
可以定义匿名字段,此位段仅仅用于占位,而不是使用。其主要的目的是为了满足将来系统升级或扩充的需要。例如
struct data
{
unsigned a:2
unsigned b:2
unsigned c:15
}
位段的长度不能够大于存储单元的长度,不能够定义位段数组。
位段的引用,其实为位成员变量的引用,可以像使用整数变量一样使用,但是要注意存储空间的限制,即可存储数据的有效范围。
REF:.txt