问题引入:
存在一个问题,如果只给你一个字节的空间,但是程序中却有两个变量需要存储,但是变量的大小都在10以内,这个问题该如何解决呢?
首先想到的就是按位操作,将一个字节分为前四个字节和后四个字节,分别存放2个变量,但是这样的按位操作比较麻烦,所以这里介绍一下位域,可以比较简单的解决这个问题。
首先简单介绍一下c语言之位域:
位域是指信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位。
当我们在存储数据时,如果这个数据不满一个或者几个字节,我们可以采用位域对其进行分配空间。
位域的使用方法如下:
当我们要建立一个2个变量,每个只占用4bit的时候,我们可以采用如下方法:
struct {
unsigned char a:4;
unsigned char b:4;
} test;
这样,a、b两个变量便可以每个占用4bit,sizeof(test)= 1,符合上面的问题要求,同时,a、b按照结构体的要求操作便可以,比较方便。
那我们该如何建立这样的位域呢?经过VC编程,我总结出如下规律:
1、位域的分配一定要按照所用变量的顺序来,用满再换,比如 char a:4 int b:4 char c:4 是不对的,这样分配两个char的四位是不会分配到一起。
2、位域的分配一定要找到符合大小的变量,比如 int a:4 int b:4 ,这样分配后就会占用 4个字节,而你只需要2个字节而已,所以用位域的时候最好分配满。
3、位域的分配符合windows的内存操作要求,及要按照4个字节对其。
下面我给几个在VC的程序的例子便可以清晰明了了:
struct
{
int a:4;
int d:4; //sizeof = 4;
}testW;
struct
{
int a:4;
int d:4; //sizeof = 8; 存在windows对其
char c:4;
}testW;
struct
{
char a:4;
char d:4; //sizeof = 1;
}testW;
struct
{
char a:4;
int c:4;
char d:4; //sizeof = 12;
}testW;
这样大家应该比较清晰如何使用位域了吧,如果有任何问题,可以私信我。