位域全解析


所謂”位域“是把一個字節中的二進位划分為幾 個不同的區域, 並說明每個區域的位數。每個域有一個域名,允許在程序中按域名進行操作。   
       它實際上是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;

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個字節內的分配,如果涉及到跨字節的位域,則要進行另外的處理。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM