第12章位運(yùn)算_第1頁
第12章位運(yùn)算_第2頁
第12章位運(yùn)算_第3頁
第12章位運(yùn)算_第4頁
第12章位運(yùn)算_第5頁
已閱讀5頁,還剩23頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、C語言程序設(shè)計(jì)語言程序設(shè)計(jì)第第1212章章 位運(yùn)算位運(yùn)算秦丹陽秦丹陽黑龍江大學(xué)電子工程學(xué)院黑龍江大學(xué)電子工程學(xué)院通信工程系通信工程系TEL: 86608943E-mail: 0000 00001 10010 20011 30100 40101 50110 60111 71000 81001 91010 A1011 B1100 C1101 D1110 E1111 F000 0001 1010 2011 3100 4101 5110 6111 70000 00001 10010 20011 30100 40101 50110 60111 71000 81001 9二二十進(jìn)制十進(jìn)制二二八進(jìn)制八進(jìn)制二

2、二十六進(jìn)制十六進(jìn)制主要內(nèi)容主要內(nèi)容12.1 位運(yùn)算符和位運(yùn)算位運(yùn)算符和位運(yùn)算12.2 位運(yùn)算舉例位運(yùn)算舉例12.3 位段位段相關(guān)概念相關(guān)概念位運(yùn)算位運(yùn)算是指按二進(jìn)制位進(jìn)行的運(yùn)算。因?yàn)樵谙到y(tǒng)軟件中,常要處理二進(jìn)制位的問題例如:將一個(gè)存儲(chǔ)單元中的各二進(jìn)制位左移或右移一位,兩個(gè)數(shù)按位相加。語言提供位運(yùn)算的功能,與其他高級(jí)語言(如PASCAL)相比,具有很大的優(yōu)越性語言提供的位運(yùn)算符有語言提供的位運(yùn)算符有:說明:說明:(1)位運(yùn)算符中除以外,均為二目(元)運(yùn)算符,即要求兩側(cè)各有一個(gè)運(yùn)算量。(2)運(yùn)算量只能是整型或字符型的數(shù)據(jù),不能為實(shí)型數(shù)據(jù)。(3)優(yōu)先級(jí)別:、 、 &、 、 |(高-低)運(yùn)算符含義按位

3、與按位或按位異或|運(yùn)算符含義取反左移右移定義定義:參加運(yùn)算的兩個(gè)數(shù)據(jù),按二進(jìn)制位進(jìn)行 “與”運(yùn)算。符號(hào)符號(hào):規(guī)則規(guī)則:如果兩個(gè)相應(yīng)的二進(jìn)制位都為,則該位的結(jié)果值為;否則為。即:注意:注意:如果參加 & 運(yùn)算的是負(fù)數(shù),則要以補(bǔ)碼形式表示為二進(jìn)制數(shù),然后再按位進(jìn)行“與”運(yùn)算。例:例: 00000011 (3)& 00000101 (5) 00000001 (1)3&5的值得用途:用途: 找一個(gè)二進(jìn)制數(shù),條件:原來的數(shù)中為的位,新數(shù)中相應(yīng)位為。然后使二者進(jìn)行運(yùn)算,即可達(dá)到清零目的。與一個(gè)數(shù)進(jìn)行運(yùn)算,此數(shù)在該位取,其它位取0。:若要對(duì)指定位清0,則用0與之相與;某些位保持不變,則用1與之相與。例:原有

4、數(shù)為,另找一個(gè)數(shù)為,將這兩個(gè)數(shù)進(jìn)行運(yùn)算: & & 例:有一個(gè)整數(shù)(個(gè)字節(jié)),想要取其中的低字節(jié)例:有一個(gè)整數(shù)(個(gè)字節(jié)),想要取其中的低字節(jié)0 0 1 0 1 1 0 0 1 0 1 0 1 1 0 00 0 1 0 1 1 0 0 1 0 1 0 1 1 0 0a a & 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 & 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1b b 0 0 0 0 0 0 0 0 1 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 1 0 0 c c例:有一數(shù),想把其中左面第、位保留下來,運(yùn)算如下: (

5、84)(84)& & (59)(59) (16)(16)例:有一個(gè)整數(shù)(個(gè)字節(jié)),想要取其中的高字節(jié)例:有一個(gè)整數(shù)(個(gè)字節(jié)),想要取其中的高字節(jié)0 0 1 0 1 1 0 0 1 0 1 0 1 1 0 00 0 1 0 1 1 0 0 1 0 1 0 1 1 0 0a a & 1 1 1 1 1 1 1 1 & 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 b 0 0 0 0 0 0 0 0 b 0 0 1 0 1 1 0 00 0 1 0 1 1 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 c c規(guī)則:規(guī)則:兩個(gè)相應(yīng)的二進(jìn)制位中只要有一個(gè)為,該位

6、的結(jié)果值為。即: | | |用途用途:常用來對(duì)一個(gè)數(shù)據(jù)的某些位定值為。例:例:060|017,060|017,將八進(jìn)制數(shù)將八進(jìn)制數(shù)6060與八與八進(jìn)制數(shù)進(jìn)制數(shù)1717進(jìn)行按位或運(yùn)算。進(jìn)行按位或運(yùn)算。 0 0 1 1 0 0 0 00 0 1 1 0 0 0 0| 0 0 0 0 1 1 1 1| 0 0 0 0 1 1 1 1 0 0 1 1 1 1 1 1 0 0 1 1 1 1 1 1例:使一個(gè)單元的低位改為,只需將其與例:使一個(gè)單元的低位改為,只需將其與0000111100001111進(jìn)行按位或運(yùn)算即可。進(jìn)行按位或運(yùn)算即可。 | | 0 0 0 0 1 1 1 10 0 0 0 1 1

7、1 1- 1 1 1 11 1 1 1 例例: :是一個(gè)整數(shù)(位)是一個(gè)整數(shù)(位)有表達(dá)式:有表達(dá)式: | | | | 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 10 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 11 1 1 1即低位全置為,高位保留原樣。即低位全置為,高位保留原樣。異或運(yùn)算符也稱 XOR運(yùn)算符。規(guī)則規(guī)則:參加運(yùn)算的兩個(gè)二進(jìn)制位同號(hào)則結(jié)果為(假);異號(hào)則結(jié)果為(真) 即:00=0,01=1,10=1,11=0用途:用途:()使特定位翻轉(zhuǎn)使特定位翻轉(zhuǎn)原數(shù)中值為1的位與1進(jìn)行運(yùn)算得0,原數(shù)中的位值0與1進(jìn)

8、行運(yùn)算的結(jié)果得1.() 與相與相 ,保留原值保留原值因?yàn)樵瓟?shù)中的與進(jìn)行 運(yùn)算得, 得,故保留原數(shù) 。() 交換兩個(gè)值,不用臨時(shí)變量交換兩個(gè)值,不用臨時(shí)變量例:例:0 0 1 1 1 0 0 1 0 0 1 1 1 0 0 1 十進(jìn)制數(shù)十進(jìn)制數(shù)5757,八進(jìn)制數(shù),八進(jìn)制數(shù)071071 0 0 1 0 1 0 1 0 0 0 1 0 1 0 1 0 十進(jìn)制數(shù)十進(jìn)制數(shù)4242,八進(jìn)制數(shù),八進(jìn)制數(shù)052052 0 0 0 1 0 0 1 1 0 0 0 1 0 0 1 1 十進(jìn)制數(shù)十進(jìn)制數(shù)1919,八進(jìn)制數(shù),八進(jìn)制數(shù)023023即:即:071052=023 071052=023 (八進(jìn)制數(shù))(八進(jìn)制數(shù)

9、)設(shè)有,想使其低位翻轉(zhuǎn),即設(shè)有,想使其低位翻轉(zhuǎn),即變?yōu)?,變?yōu)?。變?yōu)椋優(yōu)?。可以將它與進(jìn)行可以將它與進(jìn)行 運(yùn)算,運(yùn)算,即:即: 運(yùn)算結(jié)果的低位正好是原數(shù)低位的翻轉(zhuǎn)??蛇\(yùn)算結(jié)果的低位正好是原數(shù)低位的翻轉(zhuǎn)。可見,要使哪幾位翻轉(zhuǎn)就將與其進(jìn)行見,要使哪幾位翻轉(zhuǎn)就將與其進(jìn)行 運(yùn)算的該運(yùn)算的該幾位置為即可。幾位置為即可。例如例如,012 00=012,012 00=012 0 0 0 0 1 0 1 00 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 00 0 0 0 1 0 1 0例如:例如:, , 。想將和的值互換想將和的值互換,

10、 ,可以用以下賦值語句實(shí)現(xiàn):可以用以下賦值語句實(shí)現(xiàn): ab ;ab ; ba ;ba ; ab ;ab ; ( ) (結(jié)果(結(jié)果,a,a已變成)已變成)( ) ( 結(jié)果結(jié)果,b,b已變成已變成 )( ) ( 結(jié)果結(jié)果,a,a已變成已變成 )即等效于以下兩步:即等效于以下兩步: 執(zhí)行前兩個(gè)賦值語句:相當(dāng)于執(zhí)行前兩個(gè)賦值語句:相當(dāng)于 b=b(ab) b=b(ab) 。 再執(zhí)行第三個(gè)賦值語句,再執(zhí)行第三個(gè)賦值語句, 由于由于 a a的值等于的值等于 ( ),b,b的值等于的值等于 ( ), ,因此因此, ,相相當(dāng)于當(dāng)于 a=a= , ,即即 a a的值等于的值等于 , ,等于等于 。得到原來的值得到

11、原來的值 。規(guī)則規(guī)則:是一個(gè)單目(元)運(yùn)算符,用來對(duì)一個(gè)二進(jìn)制數(shù)按位取反,即將變,將變 。 例如:是對(duì)八進(jìn)制數(shù) ( 即二進(jìn)制數(shù) ) 按位求反 。0000000000010101( )1111111111101010 ( (八進(jìn)制數(shù)八進(jìn)制數(shù) 177752)177752)規(guī)則規(guī)則:將一個(gè)數(shù)的各二進(jìn)制位全部左移若干位。用途用途:左移位相當(dāng)于該數(shù)乘以,左移位相當(dāng)于該數(shù)乘以 22注意:注意:此結(jié)論只適用于該數(shù)左移時(shí)被溢出舍棄的高位只適用于該數(shù)左移時(shí)被溢出舍棄的高位中不包含的情況中不包含的情況。 假設(shè)以一個(gè)字節(jié)(位)存一個(gè)整數(shù),若為無符號(hào)整型變量,則時(shí),左移一位時(shí)溢出的是,而左移位時(shí),溢出的高位中包含。例

12、如例如,a=a2 ,a=a2a2表示將表示將a a的各二進(jìn)制位右移的各二進(jìn)制位右移 2 2位,移到右端的位,移到右端的低位被舍棄低位被舍棄, ,對(duì)無符號(hào)數(shù)對(duì)無符號(hào)數(shù), ,高位補(bǔ)高位補(bǔ) 0 0。例:例:a=017a=017,a a的值用二進(jìn)制形式表示為的值用二進(jìn)制形式表示為 0000111100001111 a2=00000011 a2=00000011(舍棄低(舍棄低2 2位位1111)例:例:a a的值是八進(jìn)制數(shù)的值是八進(jìn)制數(shù) 113755113755:a:1001011111101101 a:1001011111101101 (用二進(jìn)制形式表示)(用二進(jìn)制形式表示)a1,010010111

13、1110110 (a1,0100101111110110 (邏輯右移時(shí)邏輯右移時(shí) ) )a1,1100101111110110 (a1,1100101111110110 (算術(shù)右移時(shí)算術(shù)右移時(shí) ) )右移一位相當(dāng)于除以右移一位相當(dāng)于除以2 2 右移右移n n位相當(dāng)于除以位相當(dāng)于除以2n2n。 位運(yùn)算符與賦值運(yùn)算符可以組成復(fù)合賦值運(yùn)算符。例如,&=,|=,=,=,=例: a & = b相當(dāng)于 a = a & b a =2相當(dāng)于a = a 4,a 4 目的是使要取出的那幾位移到最右端未未右移時(shí)的情況 右移4位后的情況 例1: 取一個(gè)整數(shù)a從右端開始的 47位與低與低4 4位為位為1 1的數(shù)進(jìn)行的數(shù)

14、進(jìn)行& &運(yùn)算,就能將這運(yùn)算,就能將這4 4位保留下來位保留下來步驟:步驟: 設(shè)置一個(gè)低4位全為1,其余全為0的數(shù)。 ( (0 4 ) 0 4) & (a 4) & ( (04 )04 )程序如下:#include void main() unsigned a,b,c,d;scanf(“%o”,&a);b=a4;c= ( 04);d=b&c;printf(“%o,%dn%o,%dn”,a,a,d,d);輸入的值為八進(jìn)制數(shù) 331,其二進(jìn)制形式為 11011001經(jīng)運(yùn)算最后得到的 d為 00001101即八進(jìn)制數(shù),十進(jìn)制數(shù) 13。輸入:輸入:331331運(yùn)行結(jié)果:運(yùn)行結(jié)果:331,217 331

15、,217 (的值)(的值)15,13 15,13 (的值)(的值)例2 循環(huán)移位。要求將進(jìn)行右循環(huán)移位,將右循環(huán)移位,即將中原來左面()位右移位,原來右端位移到最左面位。步驟: 將的右端位先放到中的高位中,實(shí)現(xiàn)語句:()(); 將右移位,其左面高位位補(bǔ),實(shí)現(xiàn)語句:; 將與進(jìn)行按位或運(yùn)算,即|;程序如下:#include void main() unsigned a,b,c;int n;scanf(“a=%o,n=%d”,&a,&n);b=an;c=c|b;printf(“%on%o”,a,c);輸入:輸入:,運(yùn)行結(jié)果:運(yùn)行結(jié)果: 3 3運(yùn)行開始時(shí)輸入八進(jìn)制數(shù)運(yùn)行開始時(shí)輸入八進(jìn)制數(shù)1576531

16、57653,即二進(jìn)制數(shù)即二進(jìn)制數(shù)11011111101010111101111110101011循環(huán)右移位后得二進(jìn)制數(shù)循環(huán)右移位后得二進(jìn)制數(shù)01111011111101010111101111110101即八進(jìn)制數(shù)即八進(jìn)制數(shù)75765757651、以下不能將變量、以下不能將變量m清零的表達(dá)式是清零的表達(dá)式是_A) m = m & m B) m = m & 0C) m = m mD) m = m | m2、設(shè)有以下語句、設(shè)有以下語句char x=3,y=6,z;z=xy2;則則z的二進(jìn)制值是的二進(jìn)制值是_A) 00010100 B) 00011011C) 00011100D) 00011000有

17、以下程序:有以下程序:#include void main( ) unsigned char a,b; a = 5 | 4; b = 5 & 4; printf(“%d,%dn”,a,b);程序執(zhí)行時(shí)的輸出結(jié)果是程序執(zhí)行時(shí)的輸出結(jié)果是_ 信息的存取一般以字節(jié)為單位。實(shí)際上,有時(shí)存儲(chǔ)一個(gè)信息不必用一個(gè)或多個(gè)字節(jié),例如,“真”或“假”用或表示,只需位即可。在計(jì)算機(jī)用于過程控制、參數(shù)檢測或數(shù)據(jù)通信領(lǐng)域時(shí),控制信息往往只占一個(gè)字節(jié)中的一個(gè)或幾個(gè)二進(jìn)制位,常常在一個(gè)字節(jié)中放幾個(gè)信息。 怎樣向一個(gè)字節(jié)中的一個(gè)或幾個(gè)二進(jìn)制位賦值怎樣向一個(gè)字節(jié)中的一個(gè)或幾個(gè)二進(jìn)制位賦值和改變它的值呢和改變它的值呢?可以用以下

18、兩種方法:(1)可以人為地將一個(gè)整型變量data分為幾部分。 但是用這種方法給一個(gè)字節(jié)中某幾位賦值太麻煩??梢晕欢谓Y(jié)構(gòu)體的方法。 (2)位段 C語言允許在一個(gè)結(jié)構(gòu)體中以位為單位來指定其成員所占內(nèi)存長度,這種以位為單位的成員稱為“位段”或稱“位域” (bit field)。利用位段能夠用較少的位數(shù)存儲(chǔ)數(shù)據(jù)。 程序如下:struct packed-data unsigned :; unsigned:; unsigned:; unsigned:; int ; data; 關(guān)于位段的定義和引用的說明:(1)位段成員的類型必須指定為unsigned或int類型。(2)若某一位段要從另一個(gè)字開始存放,可用以下形式定義:unsigned :1;unsignedb:;一個(gè)存儲(chǔ)單元 unsigned:;unsigned:;另一存儲(chǔ)單元 a、b、c應(yīng)連續(xù)

溫馨提示

  • 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)論