《C語言程序設(shè)計(jì)》課件第9章_第1頁
《C語言程序設(shè)計(jì)》課件第9章_第2頁
《C語言程序設(shè)計(jì)》課件第9章_第3頁
《C語言程序設(shè)計(jì)》課件第9章_第4頁
《C語言程序設(shè)計(jì)》課件第9章_第5頁
已閱讀5頁,還剩16頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

本章目錄9.1位運(yùn)算符9.2位域前面介紹的各種運(yùn)算都是以字節(jié)作為最基本位進(jìn)行的。但在很多系統(tǒng)程序中常要求在位(bit)一級(jí)進(jìn)行運(yùn)算或處理。C語言提供了位運(yùn)算的功能,所謂的位運(yùn)算是進(jìn)行二進(jìn)制位的運(yùn)算。這使得C語言也能像匯編語言一樣用來編寫系統(tǒng)程序。9.1位運(yùn)算符C語言提供了六種位運(yùn)算符:運(yùn)算符含義

&按位與|按位或^按位異或~取反<<左移>>右移說明:

(1)位運(yùn)算符中除了~,均為二目運(yùn)算符。

(2)運(yùn)算對(duì)象只能是整型或字符型的數(shù)據(jù),不能為其它類型。9.1位運(yùn)算符9.1.1按位與運(yùn)算

按位與運(yùn)算符"&"是雙目運(yùn)算符。其功能是參與運(yùn)算的兩數(shù)各對(duì)應(yīng)的二進(jìn)位相與。只有對(duì)應(yīng)的兩個(gè)二進(jìn)位均為1時(shí),結(jié)果位才為1,否則為0。參與運(yùn)算的數(shù)以補(bǔ)碼方式出現(xiàn)。例如:9&5可寫算式如下:00001001(9的二進(jìn)制補(bǔ)碼)&00000101(5的二進(jìn)制補(bǔ)碼)

00000001(1的二進(jìn)制補(bǔ)碼)可見9&5=1。00001001&0000010100000001按位與運(yùn)算通常用來對(duì)某些位清0或保留某些位。例如即想讓某一個(gè)字節(jié)或多個(gè)字節(jié)中的位為0。例如:00001001(十進(jìn)制9)只要找到這樣的數(shù)00000110、11110110、00000000等都可以,即只要和要清零數(shù)中每一個(gè)二進(jìn)制位相反即可,或者某一位二進(jìn)制位為0和0與結(jié)果也是0。

9.1位運(yùn)算符例9.1按位與程序舉例main(){inta=9,b=5,c;c=a&b;printf("a=%d\nb=%d\nc=%d\n",a,b,c);}運(yùn)行結(jié)果:9.1位運(yùn)算符9.1.2按位或運(yùn)算

按位或運(yùn)算符“|”是雙目運(yùn)算符。其功能是參與運(yùn)算的兩數(shù)各對(duì)應(yīng)的二進(jìn)位相或。只要對(duì)應(yīng)的兩個(gè)二進(jìn)位有一個(gè)為1時(shí),結(jié)果位就為1。參與運(yùn)算的兩個(gè)數(shù)均以補(bǔ)碼出現(xiàn)。例如:9|5可寫算式如下:00001001|0000010100001101(十進(jìn)制為13)可見9|5的結(jié)果為13。按位或通常用來使某位二進(jìn)制位為1。例如:00001001(十進(jìn)制9)使前4位二進(jìn)制位為1,與11110000、11111001等數(shù)進(jìn)行按位或運(yùn)算即可9.1位運(yùn)算符例9.2按位或程序舉例main(){inta=9,b=5,c;c=a|b;printf("a=%d\nb=%d\nc=%d\n",a,b,c);}運(yùn)行結(jié)果:9.1位運(yùn)算符9.1.3按位異或運(yùn)算按位異或運(yùn)算符“^”是雙目運(yùn)算符。其功能是參與運(yùn)算的兩數(shù)各對(duì)應(yīng)的二進(jìn)位相異或,當(dāng)兩對(duì)應(yīng)的二進(jìn)位相異時(shí),結(jié)果為1。參與運(yùn)算數(shù)仍以補(bǔ)碼出現(xiàn),例如9^5可寫成算式如下:00001001^0000010100001100(十進(jìn)制為12)9^5結(jié)果為12。按位異或通常用來:(1)與0異或,可以保留原值不變。如10^000001010

^00000000000010109.1位運(yùn)算符(2)可以不使用中間變量,將兩個(gè)數(shù)交換。例如a=2,b=3,是兩個(gè)數(shù)交換,可以用下面的語句:a=a^b;b=b^a;a=a^b;例9.3按位異或程序舉例。main(){inta=2,b=3;a=a^b;b=b^a; a=a^b;printf("a=%d,b=%d\n",a,b);}運(yùn)行結(jié)果:9.1位運(yùn)算符9.1.4求反運(yùn)算求反運(yùn)算符~為單目運(yùn)算符,具有右結(jié)合性。其功能是對(duì)參與運(yùn)算的數(shù)的各二進(jìn)位按位求反。例如~9的運(yùn)算為:~(0000000000001001)結(jié)果為:1111111111110110。9.1位運(yùn)算符9.1.5左移運(yùn)算

左移運(yùn)算符“<<”是雙目運(yùn)算符。其功能把“<<”左邊的運(yùn)算數(shù)的各二進(jìn)位全部左移若干位,由“<<”右邊的數(shù)指定移動(dòng)的位數(shù),高位丟棄,低位補(bǔ)0。例如:a<<2指把a(bǔ)的各二進(jìn)位向左移動(dòng)2位。如a=2,十進(jìn)制00000010,左移2位后為00001000(十進(jìn)制8)。高位左移,低位補(bǔ)0。并且左移一位相當(dāng)于乘以2的運(yùn)算,左移兩位相當(dāng)于乘以4即22。例9.4左移程序舉例

main(){inta=2;a=a<<2;printf(“a=%d\n”,a);}運(yùn)算結(jié)果:9.1位運(yùn)算符9.1.6右移運(yùn)算右移運(yùn)算符“>>”是雙目運(yùn)算符。其功能是把“>>”左邊的運(yùn)算數(shù)的各二進(jìn)位全部右移若干位,“>>”右邊的數(shù)指定移動(dòng)的位數(shù)。例如:設(shè)a=12,a>>2表示把000001100右移為00000011(十進(jìn)制3)。應(yīng)該說明的是,對(duì)于有符號(hào)數(shù),在右移時(shí),符號(hào)位將隨同移動(dòng)。當(dāng)為正數(shù)時(shí),最高位補(bǔ)0,而為負(fù)數(shù)時(shí),符號(hào)位為1,最高位是補(bǔ)1。9.1位運(yùn)算符例9.4左移程序舉例

main(){inta=12;a=a>>2;printf(“a=%d\n”,a);}運(yùn)算結(jié)果:9.2位域有些信息在存儲(chǔ)時(shí),并不需要占用一個(gè)完整的字節(jié),而只需占幾個(gè)或一個(gè)二進(jìn)制位。例如在存放一個(gè)開關(guān)量時(shí),只有0和1兩種狀態(tài),用一位二進(jìn)位即可。為了節(jié)省存儲(chǔ)空間,并使處理簡(jiǎn)便,C語言又提供了一種數(shù)據(jù)結(jié)構(gòu),稱為“位域”或“位段”。所謂“位域”是把一個(gè)字節(jié)中的二進(jìn)位劃分為幾個(gè)不同的區(qū)域,并說明每個(gè)區(qū)域的位數(shù)。每個(gè)域有一個(gè)域名,允許在程序中按域名進(jìn)行操作。這樣就可以把幾個(gè)不同的對(duì)象用一個(gè)字節(jié)的二進(jìn)制位域來表示。1.位域的定義與結(jié)構(gòu)體定義類似,形式為:struct位域結(jié)構(gòu)名{位域列表};其中位域列表的形式為:類型說明符位域名:位域長(zhǎng)度9.2位域例如:structbs{inta:8;intb:2;intc:6;};位域變量的說明與結(jié)構(gòu)變量說明的方式相同。采用先定義后說明,同時(shí)定義說明或者直接說明這三種方式。例如:structbs{inta:8;intb:2;intc:6;}data;說明data為bs變量,共占兩個(gè)字節(jié)。其中位域a占8位,位域b占2位,位域c占6位。9.2位域?qū)τ谖挥虻亩x有以下幾點(diǎn)說明:1)一個(gè)位域必須存儲(chǔ)在同一個(gè)字節(jié)中,不能跨兩個(gè)字節(jié)。如一個(gè)字節(jié)所??臻g不夠存放另一位域時(shí),應(yīng)從下一單元起存放該位域。也可以有意使某位域從下一單元開始。例如:structbs{unsigneda:4;unsigned:0;/*空域*/unsignedb:4;/*從下一單元開始存放*/unsignedc: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)整位置。無名的位域是不能使用的。例如:9.2位域structk{inta:1;int:2;/*該2位不能使用*/intb:3;intc:2;};4)位域的成員的類型是int型或者unsigned型。從以上分析可以看出,位域在本質(zhì)上就是一種結(jié)構(gòu)類型,不過其成員是按二進(jìn)位分配的。位域的使用和結(jié)構(gòu)成員的使用相同,其一般形式為:位域變量名·位域名位域允許用各種格式輸出。9.2位域例9.5位域程序舉例main(){structbs{unsigneda:1;unsignedb:3;unsignedc:4;}bit,*pbit;bit.a=1;bit.b=7;bit.c=15;printf("a=%d,b=%d,c=%d\n",bit.a,bit.b,bit.c);pbit=&bit;pbit->a=0;pbit->b&=3;pbit->c|=1;9.2位域上例程序中定義了位域結(jié)構(gòu)bs,三個(gè)位域?yàn)閍,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è)域的值。printf("a=%d,b=%d,c=%d\n",pbit->a,pbit->b,pbit->c);}運(yùn)行結(jié)果:

本章小結(jié)1.位運(yùn)算是C語言的一種特殊運(yùn)算功能,它是以二進(jìn)制位為單位進(jìn)行運(yùn)算的。位運(yùn)算符只有邏輯運(yùn)算和移位

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論