在实际的应用中,有些数据的存储只需要几个二进制位,而不需要一个字节或几个字节,比如:电灯接通电源的状态,只有通电和未通电两种状态,用 1 和 0 就可以表示,为了满足这种需求,C 语言中引入了位域的概念
位域是什么
位域是一种数据结构,可以把数据以二进制位的形式紧凑的存储,它允许程序对此结构的位进行操作
在计算机早期,内存是非常稀缺的,需要尽可能的节省每一个字节,所以,C 语言中就出现了能针对二进制位进行操作的位域
为什么要用位域
位域这种数据结构,可以最大限度的节省存储空间,对于一些非常频繁的操作,需要尽可能的减少操作的数据,比如:在开发网络应用时,数据的序列化和反序列化是很频繁的,如果能减少数据的长度,对提升数据打包效率是很有帮助的
位域的出现,让我们可以用变量名代表某些bit,并通过变量名获取和设置 bit 的值,而不是通过晦涩难理解的位操作来进行,例如:
struct field
{
unsigned char b0 : 3,
b1 : 2,
b2 : 3;
};
struct field bf;
bf.b1 = 3;
通过位域设置中间 2 个bit 的值,只需要设置结构体中 b1
字段值即可,如果使不用位域字段,就需要进行位的 “或” 和 “与” 运算
位域的使用
C 语言中,位域的表示形式如下
struct bitfield
{
unsigned int b0 : n0,
b1 : n1,
b2 : n2,
...
bn : nk;
};
b0、b1、b2 ... bn
表示位域成员,n0、n1、n2 ... nk
表示成员占用多少个 bit
位域表示的范围通常不能超过其所依附类型所能表示的 bit 数,比如:上面 bitfield
结构体中 位域所依附的类型是 unsigned int
, 最大能表示 32 个 bit,也就是说,n0、n1、n2 ... nk
总 bit 数不能超过 32,每个成员超过指定 bit 表示的最大数值时会被截断,具体请看下面的例子
#include <stdio.h>
int main()
{
stru