中翻英 有些信息在貯存時,其實不需要佔用一個完全的byte, 而只需占幾個或一個二進制位翻譯例如在寄存一個開關量時,只有0和1 兩種狀況, 用一名二進位便可翻譯為了節流貯存空間,並使處置懲罰簡潔,C說話又提供了一種數據結構,稱為「位域」或「位段」。
所謂「位域」是把一個byte中的二進位劃分為幾個分歧的區域, 並申明每個區域的位數。每個域有一個域名,許可在法式中按域名進行操作。 這樣就可以把幾個不同的對象用一個byte的二進制位域來暗示。
1、位域的定義和位域變量的說明位域界說與構造定義相仿,其形式為:
struct 位域佈局名
{ 位域列表 };
個中位域列表的形式為: 類型說明符 位域名:位域長度
例如:
struct bs
{
int a:8;
int b:2;
int c:6;
};
位域變量的申明與構造變量說明的方式不異翻譯 可採用先界說後說明,同時定義申明或直接說明這三種方式翻譯例如:
struct bs
{
int a:8;
int b:2;
int c:6;
}data;
申明data為bs變量,共佔兩個byte。個中位域 a占8位,位域 b占2位,位域 c占6位。對於位域的定義另有以下幾點申明:
1. 一個位域必需貯存在統一個byte中,不克不及跨兩個byte。如一個byte所剩空間不敷寄存另外一位域時,應從下一單位起寄存該位域。也能夠成心使某位域從下一單位入手下手翻譯例如:
struct bs
{
unsigned a:4
unsigned :0 /*空域*/
unsigned b:4 /*從下一單位最先寄存*/
unsigned c:4
}
在這個位域界說中,a佔第一byte的4位,後4位填0示意不利用,b從第二byte入手下手,佔用4位,c佔用4位。
2. 由於位域不允許跨兩個byte,因此位域的長度不克不及大於一個byte的長度,也就是說不克不及超過8位二進位。
3. 位域可以無位域名,這時它只用來作填充或調劑位置翻譯無名的位域是不克不及使用的翻譯例如:
struct k
{
int a:1
int :2 /*該2位不能使用*/
int b:3
int c:2
};
從以上闡發可以看出,位域在素質上就是一種結構類型, 不過其成員是按二進位分派的。
2、位域的使用
位域的使用和佈局成員的利用相同,其一般形式為: 位域變量名·位域名 位域許可用各類格式輸出。
main(){
struct bs
{
unsigned a:1;
unsigned b:3;
unsigned c:4;
} bit翻譯社*PBit;
bit.a=1;
bit.b=7;
bit.c=15;
printf("%d翻譯社%d,%d
",bit.a,bit.b,bit.c);
PBit=&bit;
PBit->a=0;
PBit->b&=3;
PBit->c=1;
printf("%d翻譯社%d,%d
",PBit->a,PBit->b,PBit->c);
}
上例程序中界說了位域構造bs,三個位域為a翻譯社b,c。說明了bs類型的變量bit和指向bs類型的指針變量PBit。這表示位域也是可使用指標的。
法式的9、10、11三行分別給三個位域賦值。( 應注意賦值不能跨越該位域的答應範圍)法式第12行以整型量花式輸出三個域的內容。第13行把位域變量bit的地址送給指針變量PBit。第14行用指針體式格局給位域a從頭賦值,賦為0翻譯第15行利用了復合的位運算符"&=", 該行相當於: PBit->b=PBit->b&3位域b華夏有值為7,與3作按位與運算的成效為3(111&011=011,十進制值為3)。一樣,法式第16行中利用了復合位運算"=", 相當於: PBit->c=PBit->c1其成效為15。法式第17行用指針體例輸出了這三個域的值翻譯
本文引用自: http://bkboy.pixnet.net/blog/post/21021022-%E7%B5%90%E6%A7%8B%E4%B8%AD%E7%9A%84%E5%86%92%E8%99%9F%E3有關各國語文翻譯公證的問題歡迎諮詢天成翻譯公司02-77260931