位于运算符:
2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
有些信息在存儲時,并不需要占用一個完整的字節(jié),而只需占幾個或一個二進(jìn)制位。例如在存放一個開關(guān)量時,只有0和1兩種狀態(tài),用一位二進(jìn)位即可。為了節(jié)省存儲空間,并使處理簡便,C語言又提供了一種數(shù)據(jù)結(jié)構(gòu),稱為“位域”或“位段”。?
所謂“位域”是把一個字節(jié)中的二進(jìn)位劃分為幾個不同的區(qū)域,并說明每個區(qū)域的位數(shù)。每個域有一個域名,允許在程序中按域名進(jìn)行操作。這樣就可以把幾個不同的對象用一個字節(jié)的二進(jìn)制位域來表示。?
1. ?位域的定義和位域變量的說明?
位域定義與結(jié)構(gòu)定義相仿,其形式為:?
? ? ? ? struct ? 位域結(jié)構(gòu)名?
? ? ? ? ? ? ? { ? 位域列表 ? };?
其中位域列表的形式為:?
? ? ? ? 類型說明符 ? 位域名:位域長度 ? ??
例如:?
? ? ? ? struct ? bs?
? ? ? ? ?{?
? ? ? ? ? ? ? int ? a:8;?
? ? ? ? ? ? ? int ? b:2;?
? ? ? ? ? ? ? int ? c:6;?
? ? ? ? ? };?
位域變量的說明與結(jié)構(gòu)變量說明的方式相同。 ? 可采用先定義后說明,同時定義說明或者直接說明這三種方式。?
例如:?
? ? ? ? struct ? bs?
? ? ? ? ? {?
? ? ? ? ? ? ? int ? a:8;?
? ? ? ? ? ? ?int ? b:2;?
? ? ? ? ? ? ? int ? c:6;?
? ? ? ? ? }data;?
說明data為bs變量,共占兩個字節(jié)。其中位域a占8位,位域b占2位,位域c占6位。?
對于位域的定義尚有以下幾點說明:?
1) ? ?一個位域必須存儲在同一個字節(jié)中,不能跨兩個字節(jié)。如一個字節(jié)所剩空間不夠存放另一位域時,應(yīng)從下一單元起存放該位域。也可以有意使某位域從下一單元開始。?
例如:?
struct ? bs?
? ? ? ? ? {?
? ? ? ? ? ? ?unsigned ? a:4?
? ? ? ? ? ? ? unsigned ? :0 ? ? ? ? ? ? ? ? /*空域*/?
? ? ? ? ? ? ? unsigned ? b:4 ? ? ? ? ? ? ? /*從下一單元開始存放*/?
? ? ? ? ? ? ? unsigned ? c:4?
? ? ? ? ? }?
? ? ? ? 在這個位域定義中,a占第一字節(jié)的4位,后4位填0表示不使用,b從第二字節(jié)開始,占用4位,c占用4位。?
2) ?由于位域不允許跨兩個字節(jié),因此位域的長度不能大于一個字節(jié)的長度,也就是說不能超過8位二進(jìn)位。?
3) ? 位域可以無位域名,這時它只用來作填充或調(diào)整位置。無名的位域是不能使用的。例如:?
? ? ? ? struct ? k?
? ? ? ? ? {?
? ? ? ? ? ? int ? a:1?
? ? ? ? ? ? int ? ? :2 ? ? ? ? ? ? ? ? ? ? /*該2位不能使用*/?
? ? ? ? ? ? int ? b:3?
? ? ? ? ? ? int ? c:2?
? ? ? ? ? };?
從以上分析可以看出,位域在本質(zhì)上就是一種結(jié)構(gòu)類型,不過其成員是按二進(jìn)位分配的。?
2. ? ?位域的使用?
位域的使用和結(jié)構(gòu)成員的使用相同,其一般形式為:?
? ? 位域變量名·位域名?
? ? 位域允許用各種格式輸出。?
例如:
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\n ",bit.a,bit.b,bit.c);?
? ? ? ? pbit=&bit;?
? ? ? ? pbit-> a=0;?
? ? ? ? pbit-> b&=3;?
? ? ? ? pbit-> c|=1;?
? ? ? ? printf( "%d,%d,%d\n ",pbit-> a,pbit-> b,pbit-> c);?
}?
上例程序中定義了位域結(jié)構(gòu)bs,三個位域為a,b,c。說明了bs類型的變量bit和指向bs類型的指針變量pbit。這表示位域也是可以使用指針的。程序的9、10、11三行分別給三個位域賦值(應(yīng)注意賦值不能超過該位域的允許范圍)。程序第12行以整型量格式輸出三個域的內(nèi)容。第13行把位域變量bit的地址送給指針變量pbit。第14行用指針方式給位域a重新賦值,賦為0。第15行使用了復(fù)合的位運(yùn)算符 "&= ",該行相當(dāng)于:?
? ? ? ? pbit-> b=pbit-> b&3?
位域b中原有值為7,與3作按位與運(yùn)算的結(jié)果為3(111&011=011,十進(jìn)制值為3)。同樣,程序第16行中使用了復(fù)合位運(yùn)算符 "|= ",相當(dāng)于:?
pbit-> c=pbit-> c|1?
其結(jié)果為15。程序第17行用指針方式輸出了這三個域的值。?
轉(zhuǎn)載于:https://my.oschina.net/u/2252538/blog/465547
總結(jié)
- 上一篇: C#.NET 大型企业信息化系统集成快速
- 下一篇: 操作系统概念学习笔记 11 进程同步(一