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