所謂」位域「是把一個字節中的二進位劃分爲幾 個不一樣的區域, 並說明每一個區域的位數。每一個域有一個域名,容許在程序中按域名進行操做。
它其實是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;
spa
也就是說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個字節內的分配,若是涉及到跨字節的位域,則要進行另外的處理。對象