有些信息在存储时,并不需要占用一个完整的字节,而只需要一个或几个二进制位即可;比如:在存放一个开关量时,只有0和1两种状态,只需要使用一个二进制位即可存储;为了节省存储空间,C语言提供了一种数据结构,称为”位域”或”位段”;所谓”位域”就是把一个字节中的8个二进制位划分为几个不同的区域,并说明每个区域的二进制位数;每一个位域都有一个位域名,允许程序员在程序中按照位域名进行访问;这样就可以把几个不同的对象用一个字节的二进制位域来表示
1. 定义
1、位域的定义与结构体的定义相仿;格式如下:
struct 位域结构名
{
类型说明符1 位域名1:位域长度1; //最低位;
类型说明符2 位域名2:位域长度2; //次低位;
类型说明符3 位域名3:位域长度3;
……
类型说明符N 位域名N:位域长度M; //最高位;其中,N∈[0,1,2…..],M∈[0,8];
};
## 2. 位域变量的说明与结构体变量的说明方式相同;可采用三种方式:先定义后说明、同时定义说明、直接说明;例如:
struct BitField
{
int a:8;
int b:2;
int c:6;
} data;
说明位域变量data,共占用2个字节;其中,位域a占8bit,位域b占2bit,位域c占6bit
3、位域变量的使用与结构体变量的使用方法相同,有两种形式:
变量: 位域变量名.位域名
指针: 位域指针名->位域名
4. 例子:
struct BitField
{
unsigned char a:2; //最低位;
unsigned char b:3;
unsigned char c:3; //最高位;
}bf;
bf.a=2;//10
bf.b=4;//100
bf.c=3;//011
输出:
011 100 10
位域中的位域字段按照从低位向高位顺序方式的顺序来看,那么,a、b、c这三个位域字段在内存中的放置情况是:
最高位是c:011,中间位是b:100,最低位是a:10;所以,这个位域结构中的8二进制内容就是: 01110010,总共8个位.