C語(yǔ)言程序設(shè)計(jì)課件11 位運(yùn)算_第1頁(yè)
C語(yǔ)言程序設(shè)計(jì)課件11 位運(yùn)算_第2頁(yè)
C語(yǔ)言程序設(shè)計(jì)課件11 位運(yùn)算_第3頁(yè)
C語(yǔ)言程序設(shè)計(jì)課件11 位運(yùn)算_第4頁(yè)
C語(yǔ)言程序設(shè)計(jì)課件11 位運(yùn)算_第5頁(yè)
已閱讀5頁(yè),還剩17頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第十一章位運(yùn)算本章要點(diǎn)位運(yùn)算的相關(guān)概念位運(yùn)算符的含義及使用;位運(yùn)算的特殊應(yīng)用;位復(fù)合賦值運(yùn)算符的含義及使用;11.1位運(yùn)算的概念程序中的所有數(shù)在計(jì)算機(jī)內(nèi)存中都是以二進(jìn)制的形式儲(chǔ)存的。位運(yùn)算說(shuō)穿了,就是直接對(duì)整數(shù)在內(nèi)存中的二進(jìn)制位進(jìn)行操作。由于位運(yùn)算直接對(duì)內(nèi)存數(shù)據(jù)進(jìn)行操作,不需要轉(zhuǎn)成十進(jìn)制,因此處理速度非???。C語(yǔ)言提供了位運(yùn)算的功能,這使得C語(yǔ)言也能像匯編語(yǔ)言一樣用來(lái)編寫(xiě)系統(tǒng)程序。參與運(yùn)算的數(shù)以補(bǔ)碼方式出現(xiàn)。參與位運(yùn)算的只能是整型或字符型數(shù)據(jù)。11.1.1字節(jié)與位二進(jìn)制數(shù)系統(tǒng)中,位,簡(jiǎn)記為b,也稱(chēng)為比特,每個(gè)0或1就是一個(gè)位(bit),位是數(shù)據(jù)存儲(chǔ)的最小單位。字節(jié)(Byte)是計(jì)算機(jī)信息存儲(chǔ)的最小單位,1個(gè)字節(jié)等于8位二進(jìn)制。計(jì)算機(jī)中的CPU位數(shù)指的是CPU一次能處理的最大位數(shù)。例如32位計(jì)算機(jī)的CPU一個(gè)機(jī)器周期內(nèi)可以處理32位數(shù)據(jù)0xFFFFFFFF一個(gè)英文的字符占用一個(gè)字節(jié),而一個(gè)漢字以及漢字的標(biāo)點(diǎn)符號(hào)、字符都占用兩個(gè)字節(jié)。一個(gè)二進(jìn)制數(shù)字序列,在計(jì)算機(jī)中作為一個(gè)數(shù)字單元,一般為8位二進(jìn)制數(shù),如一個(gè)ASCII碼就是一個(gè)字節(jié)。字節(jié)單位還有KB、MB、GB、TB等,此類(lèi)單位的換算為:1KB=1024B1MB=1024KB1GB=1024MB1TB=1024GB11.1.2補(bǔ)碼一個(gè)數(shù)據(jù)在計(jì)算機(jī)內(nèi)部表示成二進(jìn)制形式稱(chēng)為機(jī)器數(shù)。機(jī)器數(shù)有不同的表示方法,常用的有原碼、反碼、補(bǔ)碼。數(shù)據(jù)的最右邊一位是“最低位”,數(shù)據(jù)最左邊一位叫做“最高位”。原碼表示規(guī)則:用最高位表示符號(hào)位,用“0”表示正號(hào),“1”表示負(fù)號(hào),其余各位表示數(shù)值大小。例如:假設(shè)某個(gè)機(jī)器數(shù)的位數(shù)為8,則56的原碼是00111000,-56的原碼是10111000。反碼表示規(guī)則:正數(shù)的反碼與原碼相同;負(fù)數(shù)的反碼,符號(hào)位為“1”不變,數(shù)值部分按位取反,即0變?yōu)?,1變?yōu)?。反碼很少直接用于計(jì)算機(jī)中,它是用于求補(bǔ)碼的過(guò)程產(chǎn)物。例如:00111000的反碼為00111000,10111000的反碼為11000111。補(bǔ)碼的表示規(guī)則:正數(shù)的補(bǔ)碼與原碼相同;負(fù)數(shù)的補(bǔ)碼是在反碼的基礎(chǔ)上加二進(jìn)制“1”。例如:00111000的補(bǔ)碼為00111000,10111000的補(bǔ)碼為11001000。補(bǔ)碼是計(jì)算機(jī)中一種重要的編碼形式,采用補(bǔ)碼后,可以將減法運(yùn)算轉(zhuǎn)化成加法運(yùn)算,運(yùn)算過(guò)程得到簡(jiǎn)化。正數(shù)的補(bǔ)碼即是它所表示的數(shù)的真值,而負(fù)數(shù)的補(bǔ)碼的數(shù)值部份卻不是它所表示的數(shù)的真值。采用補(bǔ)碼進(jìn)行運(yùn)算,所得結(jié)果仍為補(bǔ)碼。一個(gè)數(shù)補(bǔ)碼的補(bǔ)碼就是它的原碼。與原碼、反碼不同,數(shù)值0的補(bǔ)碼只有一個(gè),即[0]補(bǔ)=00000000B。若字長(zhǎng)為8位,則補(bǔ)碼所表示的范圍為-128~+127;進(jìn)行補(bǔ)碼運(yùn)算時(shí),所得結(jié)果不應(yīng)超過(guò)補(bǔ)碼所能表示數(shù)的范圍。在實(shí)際應(yīng)用中,注意原碼、反碼、補(bǔ)碼之間的相互轉(zhuǎn)換,由于正數(shù)的原碼、補(bǔ)碼、反碼表示方法均相同,當(dāng)遇到正數(shù)時(shí)不需轉(zhuǎn)換。進(jìn)行轉(zhuǎn)換時(shí),首先判斷其符號(hào)位,為負(fù)時(shí),再進(jìn)行轉(zhuǎn)換。例:已知某數(shù)X的原碼為10110110B,求X的補(bǔ)碼和反碼。由[X]原=10110110B知,符號(hào)位為“1”,X為負(fù)數(shù)。求其反碼時(shí),符號(hào)位不變,數(shù)值部分按位求反,求其補(bǔ)碼時(shí),再在其反碼的末位加1。計(jì)算過(guò)程如下:原碼:10110110反碼:11001001+1補(bǔ)碼:11001010求得:[X]反=11001011B,[X]補(bǔ)=11001010B。例:已知某數(shù)X的補(bǔ)碼11101100B,試求其原碼。由[X]補(bǔ)=11101110B知,符號(hào)位為“1”,X為負(fù)數(shù)。補(bǔ)碼的補(bǔ)碼就是原碼,故求其原碼表示時(shí),符號(hào)位不變,數(shù)值部分按位求反,再在末位加1。補(bǔ)碼:11101100求反:10010011+1原碼:10010100求得:[X]原=10010100B。例:求18-15的值。利用補(bǔ)碼,減法運(yùn)算就轉(zhuǎn)化為加法實(shí)現(xiàn),變成了求[18-15]補(bǔ),[18-15]補(bǔ)等價(jià)為[18]補(bǔ)+[-15]補(bǔ),先求-15的補(bǔ)碼,-15的二進(jìn)制表示為10001111,則-15的補(bǔ)碼為11110000+111110001與18的補(bǔ)碼相加00010010[18]補(bǔ)+11110001[-15]補(bǔ)100000011[18]補(bǔ)+[-15]補(bǔ)舍去運(yùn)算溢出的最高一位(模運(yùn)算),結(jié)果為00000011,符號(hào)位為“0”,故為正數(shù),正數(shù)的補(bǔ)碼為其本身,轉(zhuǎn)化為十進(jìn)制為3。如果計(jì)算機(jī)的字長(zhǎng)為n位,n位二進(jìn)制數(shù)的最高位為符號(hào)位,其余n-1位為數(shù)值位,采用補(bǔ)碼表示法時(shí),可表示的數(shù)X的范圍是-2n-1≤X≤2n-1-1,如當(dāng)n=8時(shí),可表示的有符號(hào)數(shù)的范圍為-128~+127。兩個(gè)有符號(hào)數(shù)進(jìn)行加法運(yùn)算時(shí),當(dāng)運(yùn)算結(jié)果超出可表示的有符號(hào)數(shù)的范圍時(shí),就會(huì)發(fā)生溢出,使計(jì)算結(jié)果出錯(cuò)。很顯然,溢出只能出現(xiàn)在兩個(gè)同符號(hào)數(shù)相加或兩個(gè)異符號(hào)數(shù)相減的情況下。在計(jì)算機(jī)中,數(shù)據(jù)是以補(bǔ)碼的形式存儲(chǔ)的,所以補(bǔ)碼在c語(yǔ)言的學(xué)習(xí)中有比較重要的地位,而學(xué)習(xí)補(bǔ)碼必然涉及到原碼、反碼。11.2二進(jìn)制位運(yùn)算程序中的所有數(shù)據(jù)在計(jì)算機(jī)內(nèi)存中都是以二進(jìn)制的形式儲(chǔ)存的。在C語(yǔ)言中,位運(yùn)算就是指直接對(duì)整數(shù)或字符型數(shù)據(jù)在內(nèi)存中的二進(jìn)制位進(jìn)行操作。很多系統(tǒng)程序中常要求在位(bit)一級(jí)進(jìn)行運(yùn)算或處理,C語(yǔ)言提供了按位運(yùn)算的功能,使其具有很強(qiáng)的優(yōu)越性,也能像匯編語(yǔ)言一樣用來(lái)編寫(xiě)系統(tǒng)程序。11.2.1二進(jìn)制位運(yùn)算說(shuō)明:(1)除“~”為單目運(yùn)算符,其它為雙目運(yùn)算符。(2)運(yùn)算數(shù)只能是整型或字符型的數(shù)據(jù),不能為實(shí)型、結(jié)構(gòu)體等類(lèi)型的數(shù)據(jù)(3)兩個(gè)不同長(zhǎng)度的運(yùn)算數(shù)進(jìn)行位運(yùn)算時(shí),系統(tǒng)會(huì)將兩個(gè)數(shù)按右端對(duì)齊,再將位數(shù)短的一個(gè)運(yùn)算數(shù)往高位擴(kuò)充,即:無(wú)符號(hào)數(shù)和正整數(shù)左側(cè)用0補(bǔ)全;負(fù)數(shù)左側(cè)用1補(bǔ)全。下面對(duì)各種位運(yùn)算符的運(yùn)算規(guī)則及其應(yīng)用作以介紹。1.按位“與”運(yùn)算符“&”運(yùn)算規(guī)則:參與運(yùn)算的兩個(gè)數(shù)各對(duì)應(yīng)的二進(jìn)制位相“與”,也就是說(shuō)只有對(duì)應(yīng)的兩個(gè)二進(jìn)制位均為1時(shí),結(jié)果位才為1,否則為0。即:0&0=0,0&1=0,1&0=0,l&1=1。按位與的應(yīng)用:(1)獲取一個(gè)二進(jìn)制數(shù)指定位的值。(2)定位清零。2.按位“或”運(yùn)算符“|”運(yùn)算規(guī)則:參與運(yùn)算的兩個(gè)數(shù)對(duì)應(yīng)的二進(jìn)制位相“或”,也就是說(shuō)只有對(duì)應(yīng)的兩個(gè)二進(jìn)制位均為0時(shí),結(jié)果位才為0,否則為1。即:0|0=0,0|1=1,1|0=l,1|1=1。按位或的應(yīng)用:利用按位或運(yùn)算將一個(gè)數(shù)據(jù)指定位值為1。3.按位“異或”運(yùn)算符“^”運(yùn)算規(guī)則:參與運(yùn)算的兩個(gè)數(shù)對(duì)應(yīng)的二進(jìn)制位相“異或”,也即是說(shuō)當(dāng)二進(jìn)制位相異時(shí),結(jié)果為1,否則為0。即:0^0=0,0^1=1,1^0=l,1^1=0。按位異或的應(yīng)用:(1)定位翻轉(zhuǎn),也就是說(shuō)使指定位的值發(fā)生變化,1變成0,0變成1。(2)不用臨時(shí)變量,交換兩個(gè)值。(3)定位保留原值,也就是說(shuō)保留指定位的值,使其不發(fā)生變化。利用保留原值位為0的二進(jìn)制數(shù)與其進(jìn)行“異或”運(yùn)算,此位值不會(huì)發(fā)生變化。4.按位“取反”運(yùn)算符“~”運(yùn)算規(guī)則:參與運(yùn)算的一個(gè)數(shù)的各二進(jìn)位按位取“反”,也就是說(shuō)0變成1,1變成0。即:~0=1,~1=0。按位取反的應(yīng)用:適當(dāng)?shù)氖褂每稍黾映绦虻囊浦残浴?.“左移”運(yùn)算符“<<”運(yùn)算規(guī)則:將“<<”與算符左邊的運(yùn)算數(shù)的二進(jìn)制位全部左移若干位,高位左移溢出部分丟棄,低位補(bǔ)0。左移運(yùn)算的應(yīng)用:當(dāng)不超出數(shù)值的值域時(shí),可以通過(guò)左移實(shí)現(xiàn)一個(gè)數(shù)據(jù)與2的n次方相乘的操作。6.“右移”運(yùn)算符“>>”運(yùn)算規(guī)則:將“>>”與算符左邊的運(yùn)算數(shù)的二進(jìn)制位全部右移若干位,低位右移部分丟棄。對(duì)于無(wú)符號(hào)數(shù)高位補(bǔ)0;對(duì)于有符號(hào)數(shù),如果原來(lái)符號(hào)位為0(正數(shù)),則高位補(bǔ)0,如果符號(hào)位為1(負(fù)數(shù)),則高位補(bǔ)0或1由計(jì)算機(jī)系統(tǒng)決定。右移運(yùn)算的應(yīng)用:右移一位相當(dāng)于該數(shù)除以2;右移n位相當(dāng)于該數(shù)除以2的n次方。11.2.2位復(fù)合賦值運(yùn)算符說(shuō)明:(1)運(yùn)算符為雙目運(yùn)算符。(2)右值只能是整型或字符型的數(shù)據(jù),不能為實(shí)型、結(jié)構(gòu)體等類(lèi)型的數(shù)據(jù)。(3)左側(cè)運(yùn)算數(shù)必須是左值。運(yùn)算規(guī)則:位復(fù)合賦值運(yùn)算符先對(duì)右值進(jìn)行相應(yīng)的位運(yùn)算,然后再將運(yùn)算結(jié)果賦值給與算符左側(cè)的變量。11.3應(yīng)用程序舉例ex1110輸入一個(gè)數(shù)m,輸出其所對(duì)應(yīng)二進(jìn)制數(shù)的從右端開(kāi)始的第6至8位。分析:首先先使m右移5位,使要取出的那幾位移到最右端,再設(shè)置一個(gè)數(shù)n低3位全為1,其余的位全為0的數(shù),即將一個(gè)全1的數(shù)左移3位,這樣右端低3位為0,最后將m&n,將m的低3位取出。程序如下:#include"stdio.h"main(){intm,n,p,t;printf("Pleaseinputmdezhi:");scanf("%d",&m);n=m>>5;p=~(~0<<3);t=n&p;printf("m=%d,t=%d\n",m,t);}程序運(yùn)行:輸入416↙在輸出結(jié)果屏上顯示:m=416,t=5說(shuō)明:輸入416,m的值為416,對(duì)應(yīng)的二進(jìn)制數(shù)為0000000110100000,m左移5位后為0000000000001101賦值給n,p的值二進(jìn)制數(shù)為0000000000000111,n&p的值對(duì)應(yīng)二進(jìn)制數(shù)為0000000000000101賦值給變量t。11.4錯(cuò)誤解析1.位運(yùn)算要求操作數(shù)的數(shù)據(jù)類(lèi)型為整型。2.左移運(yùn)算將一個(gè)位串信息向左移指定的位,左端移出的位的信息就被丟棄,右端空出的位用0補(bǔ)充。例如014<<2,結(jié)果為060,即48。3.右移運(yùn)算將一個(gè)位串信息向右移指定的位,右端移出的位的信息被丟棄。例如12>>2,結(jié)果為3。與左移相反,對(duì)于小整數(shù),每右移1位,相當(dāng)于除以2。在右移時(shí),需要注意符號(hào)位問(wèn)題。對(duì)無(wú)符號(hào)數(shù)據(jù),右移時(shí),左端空出的位用0補(bǔ)充。對(duì)于帶符號(hào)的數(shù)據(jù),如果移位前符號(hào)位為0(正數(shù)),則左端也是用0補(bǔ)充;如果移位前符號(hào)位為1(負(fù)數(shù)),則左端用0或用1補(bǔ)充,取決于計(jì)算機(jī)系統(tǒng)。對(duì)于負(fù)數(shù)右移,稱(chēng)用0補(bǔ)充的系統(tǒng)為“邏輯右移”,用1補(bǔ)充的系統(tǒng)為“算術(shù)右移”。11.5小

溫馨提示

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

評(píng)論

0/150

提交評(píng)論