再上一篇:6.3 字符串处理函数
上一篇:第七章 结构体、共同体和枚举类型
主页
下一篇:7.3 共同体的定义及应用
再下一篇:7.4 枚举类型
文章列表

7.2 位域

《VC++程序设计基础》,讲述C++语言的语法和标准库,以及Visual C++ 函数库和MFC类库的使用,并附相关代码示例。

当要表示一个0到15之间的一个无符号整数时,一般要占用二个或四个字节,实际上可用四个二进位表示。由此,为了节省存储空间, 可以在一个字或一个字节中表示几个数或建立若干个标志(一个标志用0或1来表示),具体做法是将一个字或一个字节根据需要划分成若干个位域。

定义位域的方法是定义一个结构体, 在结构体中指定每一个成员占用的二进制的位数,即位域。定义位域的一般格式为:

struct <结构体名> {

unsigned <位域名1> : <二进位数>;

unsigned <位域名2> : <二进位数>;

......

};

其中位域名由标识符构成,也称其为成员名。如:

struct data {

unsigned flaga:1;

unsigned flagb:2;

unsigned flagc:4;

} flag;

data f1;

定义了一个位域类型data,其中成员flaga占用一个二进位,其取值只能是0或1; flagb占用二个二进位,只能取0、1、2、3中的某一个值; flagc 占用四个二进位,只能取0至15之间的某一个值。在上列说明中flag和f1为位域类型的变量,系统为flag和f1各分配一个字节的存储空间。对位域类型变量的使用方法与结构体变量完全相同。如:

flag.flaga=1; flag.flagb=3;

关于位域类型,说明以下几点:

1、位域的类型必须说明无符号整型。在一个结构体中定义的任一个位域都必须在同一个字中。如果本字中剩余的二进制位数不够定义一个位域时,则该字的剩余的二进位不用,而从下一个字开始。

2、当要跳过某几个二进位时,可以定义一个无名的位域。如:

struct data1 {

unsigned flaga:4;

unsigned :4; //跳过4 个二进位

unsigned flagc:2;

unsigned flagd:7;

int i;

} flag1;

3、一个位域的长度不能大于一个字的长度。

4、位域变量的使用方法与结构变量的使用方法完全一样。同类型的位域变量之间可以相互赋值,位域变量作为函数的参数时,属于值传递,它也不能直接输入输出。

5、同一字中,位域的分配方向随机器而异,可能从右到左,也可能从左到右。

6、位域变量的成员只能作为一个无符号整数来使用,当要存入一个成员中的数大于该成员所能表示的范围时,超过的高位部分被丢去,即按取模后的数存入该成员。如:

flag1.flaga = 17;

则成员flaga的值为1,因flaga占用四个二进位,表示最大的无符号整数为15,所以,上面的语句等同于:

flag1.flaga = 17 % 16;

注意,在主存空间够用的情况下,通常不要使用位域变量。因使用位域变量,虽然可以省一点存储空间,但存取位域变量的值时,花费的时间多。位域变量通常极少使用,主要用在系统程序设计中。