C語言位域操作
阿新 • • 發佈:2019-01-24
所謂“位域”是把一個位元組中的二進位劃分為幾個不同的區域,並說明每個區域的位數。每個域有一個域名,允許在程式中按域名進行操作。這樣就可以把幾個不同的物件用一個位元組的二進位制位域來表示。
一、位域例項
例如:
struct demo
{
int a:3;
int b:2;
int c:6;
};
sizeof(demo ) = 4;
2. 位域可以無位域名,這時它只用來作填充或調整位置。無名的位域是不能使用的。
struct demo
{
int a:3;
int :2; //unused
傳統的位域,可以方便的實現位操作,但是需要對結構體整體讀出時比較麻煩。如果有些場合需要對位進行操作,又有把結構體整體讀出需求時,往往讓人不知所措,這事可以用聯合體+結構體(位域)的方法實現。
位域的概念:
有些資訊在儲存時,並不需要佔用一個完整的位元組, 而只需佔幾個或一個二進位制位。例如在存放一個開關量時,只有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位整型變數的值,也可提取單個位的值。