溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

Linux C語(yǔ)言有沒(méi)有bit

發(fā)布時(shí)間:2023-03-28 11:25:19 來(lái)源:億速云 閱讀:72 作者:iii 欄目:建站服務(wù)器

本文小編為大家詳細(xì)介紹“Linux C語(yǔ)言有沒(méi)有bit”,內(nèi)容詳細(xì),步驟清晰,細(xì)節(jié)處理妥當(dāng),希望這篇“Linux C語(yǔ)言有沒(méi)有bit”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來(lái)學(xué)習(xí)新知識(shí)吧。

Linux C語(yǔ)言有bit;在單片機(jī)C語(yǔ)言中,bit是新增的一個(gè)關(guān)鍵詞,常用來(lái)定義一個(gè)“位變量” ;C語(yǔ)言定義bit型數(shù)據(jù)的方法是:1、通過(guò)sbit或者bit定義;2、通過(guò)位域(結(jié)構(gòu)體中)定義;3、通過(guò)組合位運(yùn)算符定義。

C語(yǔ)言定義bit型數(shù)據(jù):

一、通過(guò)sbit或者bit定義

sbit映射到IO口(P1^1這種IO口的“位”)

bit在RAM中的可位尋址空間中,一般用作程序判斷的標(biāo)志位。

認(rèn)為它們一個(gè)對(duì)外(sbit),一個(gè)對(duì)內(nèi)(bit)。

在單片機(jī)C語(yǔ)言中,bit是新增的一個(gè)關(guān)鍵詞,常用來(lái)定義一個(gè)“位變量”

二、通過(guò)位域(結(jié)構(gòu)體中)定義

位域的定義和位域變量的說(shuō)明位域定義與結(jié)構(gòu)定義相仿,其形式為:

  struct 位域結(jié)構(gòu)名

  { 位域列表 };

  其中位域列表的形式為: 類(lèi)型說(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)從下一單元起存放該位域。也可以有意使某位域從下一單元開(kāi)始。例如:

struct bs 
{ 
 unsigned a:4 
 unsigned :0 /*空域*/ 
 unsigned b:4 /*從下一單元開(kāi)始存放*/ 
 unsigned c:4 
}

  在這個(gè)位域定義中,a占第一字節(jié)的4位,后4位填0表示不使用,b從第二字節(jié)開(kāi)始,占用4位,c占用4位。

  2. 由于位域不允許跨兩個(gè)字節(jié),因此位域的長(zhǎng)度不能大于一個(gè)字節(jié)的長(zhǎng)度,也就是說(shuō)不能超過(guò)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)類(lèi)型, 不過(guò)其成員是按二進(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->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類(lèi)型的變量bit和指向bs類(lèi)型的指針變量PBit。這表示位域也是可以使用指針的。

  程序的9、10、11三行分別給三個(gè)位域賦值。( 應(yīng)注意賦值不能超過(guò)該位域的允許范圍)程序第12行以整型量格式輸出三個(gè)域的內(nèi)容。第13行把位域變量bit的地址送給指針變量PBit。第14行用指針?lè)绞浇o位域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行用指針?lè)绞捷敵隽诉@三個(gè)域的值。

使用位域的主要目的是壓縮存儲(chǔ),其大致規(guī)則為:

1)  如果相鄰位域字段的類(lèi)型相同,且其位寬之和小于類(lèi)型的sizeof大小,則后面的字段將緊鄰前一個(gè)字段存儲(chǔ),直到不能容納為止;

2)  如果相鄰位域字段的類(lèi)型相同,但其位寬之和大于類(lèi)型的sizeof大小,則后面的字段將從新的存儲(chǔ)單元開(kāi)始,其偏移量為其類(lèi)型大小的整數(shù)倍;

3)  如果位域字段之間穿插著非位域字段,則不進(jìn)行壓縮;

4)  整個(gè)結(jié)構(gòu)體的總大小為最寬基本類(lèi)型成員大小的整數(shù)倍。

三、通過(guò)通過(guò)組合 位運(yùn)算符 來(lái)操作

#define Setbit(x,y)  (x|=(0x01<<y))   //置位
#define Clrbit(x,y)  (x&=(~(0x01<<y)))  //復(fù)位(清零)
#define Chkbit(x,y)  (x&(0x01<<y))     //檢位

讀到這里,這篇“Linux C語(yǔ)言有沒(méi)有bit”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識(shí)點(diǎn)還需要大家自己動(dòng)手實(shí)踐使用過(guò)才能領(lǐng)會(huì),如果想了解更多相關(guān)內(nèi)容的文章,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI