位域全解析

所謂」位域「是把一個字節中的二進位劃分爲幾 個不一樣的區域, 並說明每一個區域的位數。每一個域有一個域名,容許在程序中按域名進行操做。   
       它其實是C語言提供的一種數據結構。
使用位域的好處是:   
       1.有些信息在存儲時,並不須要佔用一個完整的字節, 而只需佔幾個或一個二進制位。例如在存放一個開關量時,只有0和1 兩種狀態, 用一位二進位便可。這樣節省存儲空間,並且處理簡便。 這樣就能夠把幾個不一樣的對象用一個字節的二進制位域來表示。
        2.能夠很方便的利用位域把一個變量給按位分解。好比只須要4個大小在0到3的隨即數,就能夠只rand()一次,而後每一個位域取2個二進制位便可,省時省空間。

        因爲沒有其餘硬件平臺實驗條件,因此下邊的例子基於intel x86硬件平臺,內存排列爲高位到低位,有SUN SPARC或其餘平臺的兄弟能夠自行實驗下。
位域的定義和位域變量的說明位域定義與結構定義相仿,其形式爲: 數據結構

struct 位域結構名 
{ 位域列表 };
其中位域列表的形式爲: 類型說明符 位域名:位域長度;

下面先看一個例子
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

union是聯合,聯合的好處就是裏邊的全部變量都用的是一個內存空間,不理解的參見谷歌。

          也就是說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個字節內的分配,若是涉及到跨字節的位域,則要進行另外的處理。對象

相關文章
相關標籤/搜索