位结构体是一种特殊的结构, 在需按位访问一个字节或字的多个位时, 位结构体比按位运算符更加方便。
一、位结构—简介
有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位。
例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可。
为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”。
所谓“位域”是把一个字节中的二进位划分为几个不同的区域, 并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。 这样就可以把几个不同的对象用一个字节的二进制位域来表示。
二、位结构—定义
1. 声明位结构体类型
一般形式具体如下:
struct 位结构体名
{数据类型 变量名: 整型常数;数据类型 变量名: 整型常数;
};
说明:
- 数据类型必须是unsigned和signed可修饰的类型(char,short,int,long)。
- 变量名是选择项, 可以不命名, 这样规定是为了排列需要。
- 整型常数必须是非负的整 数, 范围是0~15, 表示二进制位的个数, 即表示有多少位。
2. 定义位结构体变量
举例说明如下:
struct bit
{int a:1;//第0位int b:2;//第1,2位int c:3;//第3,4,5位int d:4;//第6,7,8,9位int e:6;//第10,11,12,13,14位
}temp;
注意:
- 位结构中的成员可以定义为unsigned, 也可定义为signed, 但当成员长度为1时, 会被认为是unsigned类型。因为单个位不可能具有符号。
- 位结构中的成员不能使用数组和指针, 但位结构变量可以是数组和指针, 如果是指针, 其成员访问方式同结构指针。
- 位结构总长度(位数), 是各个位成员定义的位数之和, 可以超过两个字节。
- 位结构成员可以与其它结构成员一起使用。
三、位结构—使用方法
位结构体变量的赋值和一般结构体赋值的方法是一样的。
初始化定义时—赋值
struct bit
{int a:1;//第0位int b:2;//第1,2位int c:3;//第3,4,5位int d:4;//第6,7,8,9位int e:6;//第10,11,12,13,14位
}temp={1,3,6,10,26};
初始化后—赋值
temp.a=1;temp.b=3;temp.c=6;temp.d=10;temp.e=26;
位结构体的使用说明举例如下:
#include <stdio.h>struct bit
{int a:1;//第0位int b:2;//第1,2位int c:3;//第3,4,5位int d:4;//第6,7,8,9位int e:6;//第10,11,12,13,14,15位
}temp={1,3,6,10,26};int main(int argc, char *argv[])
{int i=*((int*)&temp);printf("0x%x\n",i);return 0;
}
运行结果如下:
0x6ab7
解释说明:
变量 | 15 14 13 12 11 10 | 9 8 7 6 | 5 4 3 | 2 1 | 0 |
---|---|---|---|---|---|
a(1) | 1 | ||||
b(3) | 1 1 | ||||
c(6) | 110 | ||||
d(10) | 1010 | ||||
e(26) | 011010 |
结果是0b0110101010110111=0x6ab7
四、位结构和共用体联合使用
具体程序如下:
#include <stdio.h>typedef union
{int data;struct {int a:1;//第0位int b:2;//第1,2位int c:3;//第3,4,5位int d:4;//第6,7,8,9位int e:6;//第10,11,12,13,14,15位}bit;
}_MQ; _MQ mq=
{.bit.a = 1,.bit.b = 3,.bit.c = 6,.bit.d = 10,.bit.e = 26
};int main(int argc, char *argv[])
{printf("data=0x%x\n",mq.data);return 0;
}
运行结果如下: