C 程序設(shè)計(jì)位運(yùn)算

上傳人:e****s 文檔編號(hào):249321857 上傳時(shí)間:2024-10-28 格式:PPT 頁數(shù):46 大?。?27.50KB
收藏 版權(quán)申訴 舉報(bào) 下載
C 程序設(shè)計(jì)位運(yùn)算_第1頁
第1頁 / 共46頁
C 程序設(shè)計(jì)位運(yùn)算_第2頁
第2頁 / 共46頁
C 程序設(shè)計(jì)位運(yùn)算_第3頁
第3頁 / 共46頁

下載文檔到電腦,查找使用更方便

16 積分

下載資源

還剩頁未讀,繼續(xù)閱讀

資源描述:

《C 程序設(shè)計(jì)位運(yùn)算》由會(huì)員分享,可在線閱讀,更多相關(guān)《C 程序設(shè)計(jì)位運(yùn)算(46頁珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。

1、單擊此處編輯母版標(biāo)題樣式,單擊此處編輯母版副標(biāo)題樣式,第12章 位運(yùn)算,12.1位運(yùn)算符和位運(yùn)算,12.2位運(yùn)算舉例,12.3位段,習(xí)題,C語言是為描述系統(tǒng)而設(shè)計(jì)的,因此它應(yīng)當(dāng)具有匯編語言所能完成的一些功能。C語言既具有高級(jí)語言的特點(diǎn),又具有低級(jí)語言的功能,因而具有廣泛的用途和很強(qiáng)的生命力。第9章介紹的指針運(yùn)算和本章將介紹的位運(yùn)算就很適合于編寫系統(tǒng)軟件的需要,是C語言的重要特色。在計(jì)算機(jī)用于檢測和控制領(lǐng)域中要用到位運(yùn)算的知識(shí),因此讀者應(yīng)當(dāng)學(xué)習(xí)和掌握本章的內(nèi)容。,所謂位運(yùn)算是指進(jìn)行二進(jìn)制位的運(yùn)算。在系統(tǒng)軟件中,常要處理二進(jìn)位的問題。例如,將一個(gè)存儲(chǔ)單元中的各二進(jìn)位左移或右移一位,兩個(gè)數(shù)按位相加等

2、。C語言提供位運(yùn)算的功能,與其他高級(jí)語言(如PASCAL)相比,它顯然具有很大的優(yōu)越性。,12.1.1“按位與運(yùn)算符(&),參加運(yùn)算的兩個(gè)數(shù)據(jù),按二進(jìn)位進(jìn)行“與運(yùn)算。如果兩個(gè)相應(yīng)的二進(jìn)位都為1,那么該位的結(jié)果值為1,否那么為0。即,0&0=0;0&1=0;1&0=0;1&1=1;,例如:3&5并不等于8,應(yīng)該是按位與。,3=00000011,(&)5=00000101,00000001,12.1位運(yùn)算符和位運(yùn)算,因此,3&5的值得1。如果參加&是負(fù)數(shù)運(yùn)算的是負(fù)數(shù)(如-3&-5),那么以補(bǔ)碼形式表示為二進(jìn)制數(shù),然后按位進(jìn)行“與運(yùn)算。,按位與有一些特殊的用途:,(1)清零。如果想將一個(gè)單元清零,即

3、使其全部二進(jìn)位為0,只要找一個(gè)二進(jìn)制數(shù),其中各個(gè)位符合以下條件:原來的數(shù)中為1的位,新數(shù)中相應(yīng)位為0。然后使二者進(jìn)行&運(yùn)算,即可到達(dá)清零目的。,如:原有數(shù)為00101011,另找一個(gè)數(shù),設(shè)它為10010100,它符合以上條件,即在原數(shù)為1的位置上,它的位值均為0。將兩個(gè)數(shù)進(jìn)行&運(yùn)算:,00101011,(&)10010100,00000000,其道理是顯然的。當(dāng)然也可以不用10010100這個(gè)數(shù)而用其他數(shù)(如01000100)也可以,只要符合上述條件即可。,(2)取一個(gè)數(shù)中某些指定位。如有一個(gè)整數(shù)a(2個(gè)字節(jié)),想要其中的低字節(jié)。只需將a與(737)8按位與即可。見圖12.1。,圖12.2,圖

4、12.1,c=a&b,b為八進(jìn)制數(shù)的377,運(yùn)算后c只保存a的低字節(jié),高字節(jié)為0。,如果想取兩個(gè)字節(jié)中的高字節(jié),只需c=a&0177400(0177400表示八進(jìn)制數(shù)的177400)。見圖12.2。,(3)要想將哪一位保存下來,就與一個(gè)數(shù)進(jìn)行&運(yùn)算,此數(shù)在該位取1,如:有一數(shù)01010100,想把其中左面第3、4、5、7、8位保存下來,可以這樣運(yùn)算:,01010100 (十進(jìn)制數(shù)84),(&)00111011 (十進(jìn)制數(shù)59),00010000(十進(jìn)制數(shù)16),即a=84,b=59,c=a&b=16。,12.1.2按位或運(yùn)算符(|),兩個(gè)相應(yīng)的二進(jìn)位中只要有一個(gè)為1,該位的結(jié)果值為1。即0|0

5、=0;0|1=1;1|0=1;1|1=1。例如:060|017,將八進(jìn)制數(shù)60與八進(jìn)制數(shù)17進(jìn)行按位或運(yùn)算。,00110000,(|)00001111,00111111,低4位全為1。如果想使一個(gè)數(shù)a的低4位改為1,只需將a與017進(jìn)行按位或運(yùn)算即可。,按位或運(yùn)算常用來對(duì)一個(gè)數(shù)據(jù)的某些位定值為1。如:a是一個(gè)整數(shù)(16位),有表達(dá)式a|0377那么低8,位全置為1。高8位保存原樣。,12.1.3“異或運(yùn)算符(),異或運(yùn)算符也稱XOR運(yùn)算符。它的規(guī)那么是假設(shè)參加運(yùn)算的兩個(gè)二進(jìn)位同號(hào),那么結(jié)果為0(假);異號(hào)那么為1(真)。即00=0;01=1;10=1;11=0;如:,00111001 (十進(jìn)制

6、數(shù)57,八進(jìn)制數(shù)071),()00101010 (十進(jìn)制數(shù)42,八進(jìn)制數(shù)052),00010011 (十進(jìn)制數(shù)19,八進(jìn)制數(shù)023),即071052,結(jié)果為023(八進(jìn)制數(shù))。,“異或的意思是判斷兩個(gè)相應(yīng)的位值是否為“異,為“異(值不同)就取真(1),否那么為假(0)。,下面舉例說明運(yùn)算符的應(yīng)用:,(1)使特定位翻轉(zhuǎn),假設(shè)有01111010,想使其低4位翻轉(zhuǎn),即1變?yōu)?,0變?yōu)???梢詫⑺c00001111進(jìn)行運(yùn)算,即,01111010,()00001111,01110101,結(jié)果值的低4位正好是原數(shù)低4位的翻轉(zhuǎn)。要使哪幾位翻轉(zhuǎn)就將與其進(jìn)行運(yùn)算的該幾位置為1即可。這是因?yàn)樵瓟?shù)中值為1的位與1進(jìn)

7、行運(yùn)算得0,原數(shù)中的位值0與1進(jìn)行運(yùn)算的結(jié)果得1。,(2)與0相,保存原值如,01200=012,00001010,()00000000,00001010,因?yàn)樵瓟?shù)中的1與0進(jìn)行運(yùn)算得1,00得0,故保存原數(shù)。,(3)交換兩個(gè)值,不用臨時(shí)變量,假設(shè)a=3,b=4。想將a和b的值互換,可以用以下賦值語句實(shí)現(xiàn):,a=ab;,b=ba;,a=ab;,可以用下面的豎式來說明:,a=011,()b=100,a=111(ab的結(jié)果,a已變成7),()b=100,b=011(ba的結(jié)果,b已變成3),()a=111,a=100(ab的結(jié)果,a變成4),即等效于以下兩步:,b=b(ab)=bab=abb=a0

8、=a,它相當(dāng)于上面的前兩個(gè)賦值語句:“a=ab;和“b=ba;。bb的結(jié)果為0,因?yàn)橥粋€(gè)數(shù)與,本身相,結(jié)果必為0?,F(xiàn)在b已得到a的值3。在上式中除了第一個(gè)b以外,其余的a、b都是指原來的a、b。,再執(zhí)行a=ab=(ab)(bab)=abbab=aabbb=b。,a得到b原來的值。,12.1.4“取反運(yùn)算符(),是一個(gè)單目(元)運(yùn)算符,用來對(duì)一個(gè)二進(jìn)制數(shù)按位取反,即將0變1,1變0。例如025是對(duì)八進(jìn)制數(shù)25(即二進(jìn)制數(shù)00010101)按位求反。,000000000010101,(),即八進(jìn)制數(shù)177752。因此,025的值為八進(jìn)制數(shù)177752。不要以為025的值是-025。,下面舉一例說

9、明運(yùn)算符的應(yīng)用。,假設(shè)一個(gè)整數(shù)a為16位,想使最低一位為0,可以用,a=a&0177776,177776a的值為八進(jìn)制數(shù)75,a&0177776的運(yùn)算可以表示如下:,0000000000111101,0000000000111100,a的最后一個(gè)二進(jìn)位變成0。但如果將C源程序移植到以32位存放一個(gè)整數(shù)的計(jì)算機(jī)系統(tǒng)(如AX 11/780)上,由于一個(gè)整數(shù)用4個(gè)字節(jié)(32位表示),想將最后一位變成0就不能用a&0177776了。讀者可以自己算一下,當(dāng)時(shí),a&0177776的結(jié)果是什么?,為了適應(yīng)以32位存放一個(gè)整數(shù)的計(jì)算機(jī)系統(tǒng),應(yīng)改用,a&037777777776,這樣改動(dòng)使移植性差了,可以改用,

10、a=a&1,它對(duì)以16位和以32位存放一個(gè)整數(shù)的情況都適用,不必作修改。因?yàn)樵谝?個(gè)字節(jié)存儲(chǔ)一個(gè)整數(shù)時(shí),1的二進(jìn)制形式為0000000000000001,1是111111,運(yùn)算符的優(yōu)先級(jí)別比算術(shù)運(yùn)算符、關(guān)系運(yùn)算符、邏輯運(yùn)算符和其他位運(yùn)算符都高,例如:a&b,先進(jìn)行a運(yùn)算,然后進(jìn)行&運(yùn)算。,12.1.5左移運(yùn)算符(),用來將一個(gè)數(shù)的各二進(jìn)位全部左移假設(shè)干位。例如:,a=a2,將a的二進(jìn)制數(shù)左移2位,右補(bǔ)0。假設(shè)a=15,即二進(jìn)制數(shù)00001111,左移2位得00111100,即十進(jìn)制數(shù)60(為簡單起見,我們用8位二進(jìn)制數(shù)表示十進(jìn)制數(shù)15,如果用16位,結(jié)果是一樣的)。,高位左移后溢出,舍棄不起作

11、用。,左移1位相當(dāng)于該數(shù)乘以2,左移2位相當(dāng)于該數(shù)乘以22=4。上面舉的例子152=60,即乘了4。但此結(jié)論只適用于該數(shù)左移時(shí)被溢出舍棄的高位中,不包含1的情況。例如,假設(shè)以一個(gè)字節(jié)(8位)存一個(gè)整數(shù),假設(shè)a為無符號(hào)整型變量,那么a=64時(shí),左移一位時(shí)溢出的是0,而左移2位時(shí),溢出的高位中包含1。左移比乘法運(yùn)算快得多,有些C編譯程序自動(dòng)將乘2的運(yùn)算用左移一位來實(shí)現(xiàn),將乘2n的冪運(yùn)算處理為左移n位。,12.1.6 右移運(yùn)算符(),a2表示將a的各二進(jìn)位右移2位。移到右端的低位被舍棄,對(duì)無符號(hào)數(shù),高位補(bǔ)0。如a=017時(shí):,11a為 00001111,a2為 00000011|11,此二位舍棄,右

12、移一位相當(dāng)于除以2,右移n位相當(dāng)于除以2n。在右移時(shí),需要注意符號(hào)位問題。對(duì)無符號(hào)數(shù),右移時(shí)左邊高位移入0。對(duì)于有符號(hào)的值,如果原來符號(hào)位為0(該數(shù)為正),那么左邊也是移入0,如同上例表示的那樣。如果符號(hào)位原來為1(即負(fù)數(shù)),那么左邊移入0還是1,要取決于所用的計(jì)算機(jī)系統(tǒng)。有的系統(tǒng)移入0,有的移入1。移入0的稱為“邏輯右移,即簡單右移。移入1的稱為“算術(shù)右移。例如,a的值為八進(jìn)制數(shù)113755。,邏輯右移時(shí)),算術(shù)右移時(shí)),在有些系統(tǒng)上,a1得八進(jìn)制數(shù)045766,而在另一些系統(tǒng)上可能得到的是145766。Turbo C和其他一些C編譯采用的是算術(shù)位移,即對(duì)有符號(hào)數(shù)右移時(shí),如果符號(hào)位原來為1,

13、左面移入高位的是1。,12.1.7位運(yùn)算賦值運(yùn)算符,位運(yùn)算符與賦值運(yùn)算符可以組成復(fù)合賦值運(yùn)算符如:&=,|=,=,=,=,例如,a&=b相當(dāng)于 a=a&b。a =2相當(dāng)于:a=a 4,設(shè)置一個(gè)低4位全為1,其余全為0的數(shù)??捎孟旅娣椒▽?shí)現(xiàn):,(0 4),0的全部二進(jìn)制為全1,左移4位,這樣右端低4位為0。見下面所示:,0:0000000000,0:1111111111,04:1111110000,(0 4)&(0 4),根據(jù)上一節(jié)介紹的方法,與低4位為1的數(shù)進(jìn)行&運(yùn)算,就能將這4位保存下來。,程序如下:,main(),unsigned a,b,c,d;,scanf(%o,&a);,b=a4;,

14、c=(04);,d=b&c;,printf(%o,%dn%o,%dn,a,a,d,d);,運(yùn)行情況如下:,331,331,217(a的值),15,13 (d的值),輸入a的值為八進(jìn)制數(shù)331,即十進(jìn)制數(shù)217,其二進(jìn)制形式為11011001。經(jīng)運(yùn)算最后得到的d為00001101,即八進(jìn)制數(shù)15,十進(jìn)制數(shù)13。,圖12.4,可以任意指定從右面第m位開始取其右面n位。只需將程序中的“b=a4改成“b=a(m-n+1)以及將“c=(04)改成“c=(0n)即可。,例12.2循環(huán)移位。要求將a進(jìn)行右循環(huán)移位。見圖12.4。圖12.4表示將a右循環(huán)移n位。即將a中原來左面(16-n)位右移n位,原來右端

15、n位移到最左面n位。今假設(shè)用兩個(gè)字節(jié)存放一個(gè)整數(shù)。為實(shí)現(xiàn)以上目的可以用以下步驟:,將a的右端n位先放到b中的高n位中??梢杂孟旅嬲Z句實(shí)現(xiàn):b=a(16-n);,將a右移n位,其左面高位n位補(bǔ)0。可以用下面語句實(shí)現(xiàn):,c=an;,將c與b進(jìn)行按位或運(yùn)算。即,c=c|b;,程序如下:,main(),unsigned a,b,c;,int n;,scanf(a=%o,n=%d,&a,&n);,b=a(16-n);,c=an;,c=c|b;,printf(%on%o,a,c);,運(yùn)行情況如下:,a=157653,n=3,0 157653,75765,12.3位段,以前曾介紹過對(duì)內(nèi)存中信息的存取一般以字

16、節(jié)為單位。實(shí)際上,有時(shí)存儲(chǔ)一個(gè)信息不必用一個(gè)或多個(gè)字節(jié),例如,“真或“假用0或1表示,只需1位即可。在計(jì)算機(jī)用于過程控制、參數(shù)檢測或數(shù)據(jù)通信領(lǐng)域時(shí),控制信息往往只占一個(gè)字節(jié)中的一個(gè)或幾個(gè)二進(jìn)位,常常在一個(gè)字節(jié)中放幾個(gè)信息。那么,怎樣向一個(gè)字節(jié)中的一個(gè)或幾個(gè)二進(jìn)位賦值和改變它的值呢?可以用以下兩種方法:,(1)可以人為地在一個(gè)字節(jié)data中設(shè)幾項(xiàng)。例如:a、b、c、d分別占2位、6位、4位、4位(見圖12.5)。如果想將c的值變?yōu)?2(設(shè)c原來為0),可以這樣:,圖12.5,將數(shù)12左移4位,使1100成為右面起第47位。,將data與“124 進(jìn)行“按位或 運(yùn)算,即可使c的值變成12。,如果c的原值不為0,應(yīng)先使之為0??梢杂孟旅娣椒ǎ?data=data&0177417,0177417的二進(jìn)制表示為,11 11111 1 0000 1111,a b c d,也就是使第47位全為0,其他位全為1。它與data進(jìn)行 15是c的最大值,c共占4位,最大值為1111即15。154是將1111移到47位。再取反,就使47位變成0,其余位全是1。即,15:0000000000001111,15

展開閱讀全文
溫馨提示:
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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

相關(guān)資源

更多
正為您匹配相似的精品文檔
關(guān)于我們 - 網(wǎng)站聲明 - 網(wǎng)站地圖 - 資源地圖 - 友情鏈接 - 網(wǎng)站客服 - 聯(lián)系我們

copyright@ 2023-2025  zhuangpeitu.com 裝配圖網(wǎng)版權(quán)所有   聯(lián)系電話:18123376007

備案號(hào):ICP2024067431號(hào)-1 川公網(wǎng)安備51140202000466號(hào)


本站為文檔C2C交易模式,即用戶上傳的文檔直接被用戶下載,本站只是中間服務(wù)平臺(tái),本站所有文檔下載所得的收益歸上傳人(含作者)所有。裝配圖網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)上載內(nèi)容本身不做任何修改或編輯。若文檔所含內(nèi)容侵犯了您的版權(quán)或隱私,請(qǐng)立即通知裝配圖網(wǎng),我們立即給予刪除!