1. 程式人生 > >C語言位域操作

C語言位域操作



傳統的位域,可以方便的實現位操作,但是需要對結構體整體讀出時比較麻煩。如果有些場合需要對位進行操作,又有把結構體整體讀出需求時,往往讓人不知所措,這事可以用聯合體+結構體(位域)的方法實現。

位域的概念:    

有些資訊在儲存時,並不需要佔用一個完整的位元組, 而只需佔幾個或一個二進位制位。例如在存放一個開關量時,只有0和1 兩種狀態, 用一位二進位即可。為了節省儲存空間,並使處理簡便。

C語言又提供了一種資料結構,稱為“位域”或“位段”。
所謂“位域”是把一個位元組中的二進位劃分為幾個不同的區域,並說明每個區域的位數。每個域有一個域名,允許在程式中按域名進行操作。這樣就可以把幾個不同的物件用一個位元組的二進位制位域來表示。
一、位域例項
例如:
struct    demo 

int a:3;       
int b:2;
int c:6;
};
sizeof(demo ) = 4;
2. 位域可以無位域名,這時它只用來作填充或調整位置。無名的位域是不能使用的。
struct    demo 

int a:3;       
int :2; //unused

};

位域其實也是結構體的一種

聯合體跟結構體的區別在於:他們外表相似,但在記憶體佈局上存在著關鍵性的區別,結構體每個成員依次儲存,聯合體中所有成員的偏移地址都是0,也就是所有成員是疊在一起的,所以在聯合體中在某一時刻,只有一個成員有效。

實際應用:

比如我想要定義一個int型變數(32位環境),對於這個變數,我需要對每一位進行位操作與讀取,可以這樣實現:

union bit32

{

int whole;

struct 

{

usigned int bit0:1;

usigned int bit1:1;

       ........

        usigned int bit31:1;

        }byte;

}bittest;

對某個位進行賦值,如 bittest.byte.bit0=1, bittest.byte.bit3=1;

對32個bit組成的int型變數進行整體檢視:printf("%d\n",bittest.whole);

則可檢視由這32個位組成的32位整型變數的值,也可提取單個位的值。