和许多计算机语言不同,C语言具备访问字节中位的内设机制,称为位域(bit-field),通过它可以访问单个的位。由于以下原因,这种特点很有价值:
1、内存紧张时,可以把若干个布尔变量存入一个字节中;
2、某些设备把编码信息传输到各个位;
3、某些加密算法需要访问字节中的位。
虽然这类任务可以通过位操作实现,但位域可以增加更多的代码结构化,也可能更高效。位域必须是许多的结构或联合(位域仅在结构内可用),它定义了以位计算的域长。位域定义的一般形式是:
type name:length;
这里,type指定位域的类型,length指定位域的位数,位域的类型必须是int、signed或unsigned(C99还允许位域是_BOOL类型,但编译器几乎对此做了扩展,允许其他类型的存在)。
例如,我们通过把时间描述成一种结构来开始,在该结构中,将时、分和秒都声明为结构位域:
typedef struct
{
unsigned seconds : 5; /*half seconds!*/
unsigned minutes : 6;
unsigned hours : 5;
} TIME;
如果我们使用类型TIME来声明我们的时间变量:
TIME time;
那么就可以把3个位域作为常规的结构成员进行引用,同时把提取和插入问题留给编译器处理。例如把时间13:34:18存储进我们打包的表示中,现在可以轻松通过3条简单的赋值语句来完成:
time.hours=13;
time.minutes=34;
time.seconds=18/2;
位域变量也有自已的限制:不能取位域变量的地址;不能构造数组位域;位域变量不能跨越整数边界。此外,编程时不可能了解不同机器中位域的顺序,这意味着位域变量引入了对机器的依赖。各种特定的实现可能会带来其他的限制。
1、内存紧张时,可以把若干个布尔变量存入一个字节中;
2、某些设备把编码信息传输到各个位;
3、某些加密算法需要访问字节中的位。
虽然这类任务可以通过位操作实现,但位域可以增加更多的代码结构化,也可能更高效。位域必须是许多的结构或联合(位域仅在结构内可用),它定义了以位计算的域长。位域定义的一般形式是:
type name:length;
这里,type指定位域的类型,length指定位域的位数,位域的类型必须是int、signed或unsigned(C99还允许位域是_BOOL类型,但编译器几乎对此做了扩展,允许其他类型的存在)。
例如,我们通过把时间描述成一种结构来开始,在该结构中,将时、分和秒都声明为结构位域:
typedef struct
{
unsigned seconds : 5; /*half seconds!*/
unsigned minutes : 6;
unsigned hours : 5;
} TIME;
如果我们使用类型TIME来声明我们的时间变量:
TIME time;
那么就可以把3个位域作为常规的结构成员进行引用,同时把提取和插入问题留给编译器处理。例如把时间13:34:18存储进我们打包的表示中,现在可以轻松通过3条简单的赋值语句来完成:
time.hours=13;
time.minutes=34;
time.seconds=18/2;
位域变量也有自已的限制:不能取位域变量的地址;不能构造数组位域;位域变量不能跨越整数边界。此外,编程时不可能了解不同机器中位域的顺序,这意味着位域变量引入了对机器的依赖。各种特定的实现可能会带来其他的限制。