共計(jì) 2064 個(gè)字符,預(yù)計(jì)需要花費(fèi) 6 分鐘才能閱讀完成。
本文丸趣 TV 小編為大家詳細(xì)介紹“Linux C 語言有沒有 bit”,內(nèi)容詳細(xì),步驟清晰,細(xì)節(jié)處理妥當(dāng),希望這篇“Linux C 語言有沒有 bit”文章能幫助大家解決疑惑,下面跟著丸趣 TV 小編的思路慢慢深入,一起來學(xué)習(xí)新知識(shí)吧。
Linux C 語言有 bit;在單片機(jī) C 語言中,bit 是新增的一個(gè)關(guān)鍵詞,常用來定義一個(gè)“位變量”;C 語言定義 bit 型數(shù)據(jù)的方法是:1、通過 sbit 或者 bit 定義;2、通過位域(結(jié)構(gòu)體中)定義;3、通過組合位運(yùn)算符定義。
C 語言定義 bit 型數(shù)據(jù):
一、通過 sbit 或者 bit 定義
sbit 映射到 IO 口(P1^1 這種 IO 口的“位”)
bit 在 RAM 中的可位尋址空間中,一般用作程序判斷的標(biāo)志位。
認(rèn)為它們一個(gè)對(duì)外(sbit),一個(gè)對(duì)內(nèi) (bit)。
在單片機(jī) C 語言中,bit 是新增的一個(gè)關(guān)鍵詞, 常用來定義一個(gè)“位變量”
二、通過位域(結(jié)構(gòu)體中)定義
位域的定義和位域變量的說明位域定義與結(jié)構(gòu)定義相仿,其形式為:
struct 位域結(jié)構(gòu)名
{位域列表};
其中位域列表的形式為:類型說明符 位域名:位域長(zhǎng)度
例如:
struct bs
{
int a:8;
int b:2;
int c:6;
};
位域變量的說明與結(jié)構(gòu)變量說明的方式相同。可采用先定義后說明,同時(shí)定義說明或者直接說明這三種方式。例如:
struct bs
{
int a:8;
int b:2;
int c:6;
}data;
說明 data 為 bs 變量,共占兩個(gè)字節(jié)。其中位域 a 占 8 位,位域 b 占 2 位,位域 c 占 6 位。對(duì)于位域的定義尚有以下幾點(diǎn)說明:
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)度,也就是說不能超過 8 位二進(jìn)位。
3. 位域可以無位域名,這時(shí)它只用來作填充或調(diào)整位置。無名的位域是不能使用的。例如:
struct k
{
int a:1
int :2 /* 該 2 位不能使用 */
int b:3
int c:2
};
從以上分析可以看出,位域在本質(zhì)上就是一種結(jié)構(gòu)類型,不過其成員是按二進(jìn)位分配的。
二、位域的使用
位域的使用和結(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-
PBit- b
PBit- c|=1;
printf(%d,%d,%d\n ,PBit- a,PBit- b,PBit- }
上例程序中定義了位域結(jié)構(gòu) bs,三個(gè)位域?yàn)?a,b,c。說明了 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è)域的值。
使用位域的主要目的是壓縮存儲(chǔ),其大致規(guī)則為:
1) 如果相鄰位域字段的類型相同,且其位寬之和小于類型的 sizeof 大小,則后面的字段將緊鄰前一個(gè)字段存儲(chǔ),直到不能容納為止;
2) 如果相鄰位域字段的類型相同,但其位寬之和大于類型的 sizeof 大小,則后面的字段將從新的存儲(chǔ)單元開始,其偏移量為其類型大小的整數(shù)倍;
3) 如果位域字段之間穿插著非位域字段,則不進(jìn)行壓縮;
4) 整個(gè)結(jié)構(gòu)體的總大小為最寬基本類型成員大小的整數(shù)倍。
三、通過通過組合 位運(yùn)算符 來操作
#define Setbit(x,y) (x|=(0x01 y)) // 置位
#define Clrbit(x,y) (x =(~(0x01 y))) // 復(fù)位(清零)#define Chkbit(x,y) (x (0x01 y)) // 檢位
讀到這里,這篇“Linux C 語言有沒有 bit”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識(shí)點(diǎn)還需要大家自己動(dòng)手實(shí)踐使用過才能領(lǐng)會(huì),如果想了解更多相關(guān)內(nèi)容的文章,歡迎關(guān)注丸趣 TV 行業(yè)資訊頻道。