正文 第48章 位運算3(1 / 2)

為了節省存儲空間,並使問題處理簡便,C語言提供了一種稱為“位域”或“位段”的數據結構。“位域”是把一個字節中的二進位劃分為多個不同的域,每個域的位數可以分別說明,每個域有一個域名,在程序中對域按域名操作。這樣就把不同的對象用一個字節的二進製位域來分別表示。例如,有些信息在存儲時,並不需要占用整個字節,隻需占一個或幾個二進製位就夠了,這種信息我們可以采用位域方式來存儲。再例如,存放一個狀態量時隻有0和1兩種狀態,用一位二進位即可表示。

1.位域的定義和位域變量的說明

位域定義與結構體定義相似,其形式為:

struct位域結構名

{位域列表;

};

其中位域列表形式為:類型說明符位域名:位域長度。

例如:

structs1

inta:3;

intb:5;

intc:2;

intd:6;

};

2.位域變量的說明

位域變量的說明有三種方式:

(1)先定義後說明;

(2)定義同時說明;

(3)直接說明。

例如:

structs2

inta:2;

intb:6;

intc:3;

}data;

說明data為s2位域結構變量,占兩個字節。其中位域a占2位,位域b占6位,位域c占3位。

對於位域的定義的幾點說明:

(1)一個位域不能跨兩個字節。

如一個字節所剩空間不足以存放另一位域時,應從下一新存儲單元作為起始存放該位域。也可以強製使某位域從下一新單元開始存放。例如:

structs3

unsigneda:4;

unsigned:0;

unsignedb:4;

unsignedc:4;

其中,a占第一字節的低4位,unsigned:0表示空域,即高4位填0,表示不使用。b從第二字節開始,占用低4位,c占用高4位。

(2)位域的長度小於8位。

由於位域不允許跨兩個字節,即不能超過8個二進製位。

(3)位域可以無位域名。

這種位域通常隻作填充或調整位置。無名位域是無法使用的。例如:

structs4

inta:1;

int:2;

intb:1;

intc:4;

};

其中,int:2;表示這兩位無位域名,不能使用。

由此看出,位域其本質就是一種成員按二進製位分配的結構體類型。

3.位域的使用

一般形式:

位域變量名.位域名

C語言源代碼:

#include

voidmain()

structs5

unsignedx:1;

unsignedy:4;

unsignedz:3;

}bit,*pbit;/*定義了位域結構s5,三個位域為x、y、z,指向s5類型的指針變量pbit*/