所謂”位域“是把一個字節中的二進位划分為幾 個不同的區域, 並說明每個區域的位數。每個域有一個域名,允許在程序中按域名進行操作。
它實際上是C語言提供的一種數據結構。
使用位域的好處是:
1.有些信息在存儲時,並不需要占用一個完整的字節, 而只需占幾個或一個二進制位。例如在存放一個開關量時,只有0和1 兩種狀態, 用一位二進位即可。這樣節省存儲空間,而且處理簡便。 這樣就可以把幾個不同的對象用一個字節的二進制位域來表示。
2.可以很方便的利用位域把一個變量給按位分解。比如只需要4個大小在0到3的隨即數,就可以只rand()一次,然后每個位域取2個二進制位即可,省時省空間。
由於沒有其他硬件平台實驗條件,所以下邊的例子基於intel x86硬件平台,內存排列為高位到低位,有SUN SPARC或其他平台的兄弟可以自行實驗下。
位域的定義和位域變量的說明位域定義與結構定義相仿,其形式為:
{ 位域列表 };
其中位域列表的形式為: 類型說明符 位域名:位域長度;
下面先看一個例子
struct
{
unsigned char x1:2;
unsigned char x2:2;
unsigned char x3:2;
unsigned char x4:2;
} wy;
這個位域定義的意思是,結構體內有四個變量x1,x2,x3,x4,每個變量占2個二進制位,那你猜猜這個結構體占大多空間呢?是1個字節,因為共8個二進制位,也就是1個字節。這個可以自己sizeof()一下進行驗證。是不是節省了空間呢。
那么來看下一個例子,實現的是上述位域的作用2
union wy
{
struct
{
unsigned char x1:2;
unsigned char x2:2;
unsigned char x3:2;
unsigned char x4:2;
}cn;
unsigned char s;
} tmp;
也就是說s和結構體cn用的是一個內存空間,都是1個字節。這樣就可以把s給按位分解。這個時候不知道你想沒有想這樣一個問題,按位分解,如何分解,從高位到低位還是從低位到高位,下邊我們通過實驗來得出結論。
看程序:
#include "stdio.h"
union wy
{
struct
{
unsigned char x1:2;
unsigned char x2:2;
unsigned char x3:2;
unsigned char x4:2;
}cn;
unsigned char s;
} tmp;
int main()
{
tmp.s = 174; //二進制形式是10101110
printf("tmp.s is %d\n",tmp.s);
printf("x1 is %d\n",tmp.cn.x1);
printf("x2 is %d\n",tmp.cn.x2);
printf("x3 is %d\n",tmp.cn.x3);
printf("x4 is %d\n",tmp.cn.x4);
return 0;
}
輸出的結果是2,3,2,2。
從這個結果我們就可以看出來,這個按位分解是從地位到高位的。對照表:
x4 x3 x2 x1
10 10 11 10
高位<----地位
但是有一點必須注意的是,這是在1個字節內的分配,如果涉及到跨字節的位域,則要進行另外的處理。