C/C++提供了一个内嵌的特征来访问字节中的为,即位域。位域很有用,因为:
1)如果存储空间受限,可以在一个字节中存储多个布尔变量(真/假)。
2)某些设备传输被编码为一个字节中的为的状态信息。
3) 某些加密程序需要访问字节中的位。
C/C++使用基于结构的方法来访问位。事实上,位域是结构成员的特殊类型,它以位(bit)为单位定义域的长度。
位域定义的一般形式如下(C++风格)
struct struct-type-name
{
type name1:length;
type name2:length;
....
type nameN:length;
} variable_list;
type是位域的类型,应该是_Bool(C99)、char、int和枚举等整型类型。
length是位域的长度,要求是非负整型常量或表达式,并且值不能大于type所对应的位宽度。例如,char bit_field:9是无法通过编译的。
另外,长度为1的位域应该声明为unsigned,因为单个位不能有符号。
给位域赋值与给其他任何类型的结构成员赋值一样。
位域并不一定要命名,这样可以跳过无用位,方便的使用希望的位。
位域变量的使用有一些限制:
1).不能使用位域变量的地址。
2).位域变量不能构成数组。
3).位域变量不能声明为静态的。
特别的,位域的使用与机器的比特序有关。
关于比特序和字节序之间的区别和联系,可以参考下文:
http://www.linuxjournal.com/article/6788
我的blog上有该文的翻译版,不过本人乃业余翻译者,不对翻译内容和质量作任何承诺和保证。
http://blog.csdn.net/lovekatherine/archive/2007/04/14/1564731.aspx
后文重点分析位域与比特序的关系,以下面的小程序为例。
#include <stdio.h>
#include <string.h>
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
typedef struct _bitdomain
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
{
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
unsigned char a:3;
unsigned char b:5;
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
} X;
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
void display (char dst)
{
int i;
unsigned int m=128;
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
while(m)
{
1)如果存储空间受限,可以在一个字节中存储多个布尔变量(真/假)。
2)某些设备传输被编码为一个字节中的为的状态信息。
3) 某些加密程序需要访问字节中的位。
C/C++使用基于结构的方法来访问位。事实上,位域是结构成员的特殊类型,它以位(bit)为单位定义域的长度。
位域定义的一般形式如下(C++风格)
struct struct-type-name
{
type name1:length;
type name2:length;
....
type nameN:length;
} variable_list;
type是位域的类型,应该是_Bool(C99)、char、int和枚举等整型类型。
length是位域的长度,要求是非负整型常量或表达式,并且值不能大于type所对应的位宽度。例如,char bit_field:9是无法通过编译的。
另外,长度为1的位域应该声明为unsigned,因为单个位不能有符号。
给位域赋值与给其他任何类型的结构成员赋值一样。
位域并不一定要命名,这样可以跳过无用位,方便的使用希望的位。
位域变量的使用有一些限制:
1).不能使用位域变量的地址。
2).位域变量不能构成数组。
3).位域变量不能声明为静态的。
特别的,位域的使用与机器的比特序有关。
关于比特序和字节序之间的区别和联系,可以参考下文:
http://www.linuxjournal.com/article/6788
我的blog上有该文的翻译版,不过本人乃业余翻译者,不对翻译内容和质量作任何承诺和保证。
http://blog.csdn.net/lovekatherine/archive/2007/04/14/1564731.aspx
后文重点分析位域与比特序的关系,以下面的小程序为例。
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/0196c3df5ea9e936f21e9932cca91014.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)