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

下載本文檔

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

文檔簡介

1、.位運(yùn)算位運(yùn)算.12.1 12.1 位運(yùn)算符與位運(yùn)算位運(yùn)算符與位運(yùn)算 位是指二進(jìn)制數(shù)的一位,其值為0或1。位段以位為單位定義結(jié)構(gòu)體(或共用體)中成員所占存儲空間的長度。含有位段的結(jié)構(gòu)體類型稱為位段結(jié)構(gòu)。.1. 位運(yùn)算符 位運(yùn)算符主要有如表11.1所示。 運(yùn)算符 含義 運(yùn)算符 含義& 按位與 取反 | 按位或 左移 按位異或 右移 說明:(1)運(yùn)算量只能是整型或字符型的數(shù)據(jù)。(2)運(yùn)算符中除位反()外,均為二目運(yùn)算符,即要求兩側(cè)各有一個運(yùn)算量。 .2. 位運(yùn)算(1)&(按位“與”)運(yùn)算規(guī)則為:0&0=0,0&1=0,1&0=0,1&1=l (即只有

2、當(dāng)兩者都為真時才為真)例如,5&9的值為1,運(yùn)算過程如下:(&) 9 = 000010015 = 111l 1011. 例如,-5&3的值為3,此時要把-5寫成補(bǔ)碼的形式,其補(bǔ)碼為111l1011,運(yùn)算過程如下:(&) 3 = 00000011-5 = 111l 1011.(2)|(按位“或”)運(yùn)算規(guī)則為:0|0=0,0|l=l,1|0=l,l|l=l (即只要有一個為真其結(jié)果為真) 例如,5|9的值為13,運(yùn)算過程如下:00001101 ( | ) 9 = 00001001 5 = 00000101 . (3) (按位“異或”)運(yùn)算規(guī)則為:00=0,01=1,

3、10=1,l1=0 (即當(dāng)兩者取值相異時為真)例如,-53的值為-8,運(yùn)算過程如下:() 3 = 00000011 11111000 -5 = 111l 1011 .(4)(按位“取反”)運(yùn)算規(guī)則為:0=l,l=0 (取相反的值)例如,7的值為-8,運(yùn)算過程如下: () 7 = 00000111.(5)(“左移”)用來將一個數(shù)的各二進(jìn)位全部左移若干位,右邊空缺位補(bǔ)0。例如,將3左移2位,結(jié)果為12。如圖12.1:0 0 0 0 0 0 1 10 0 0 0 1 1 0 0左移2位圖12.1 3左移兩位得到12左移1位相當(dāng)于該數(shù)乘以2,左移n位相當(dāng)于該數(shù)乘以2 n。 因此,將3左移2位,相當(dāng)于3

4、乘以4。 .(6)(“右移”)用來將一個數(shù)的各二進(jìn)位全部右移若干位。移去右端的位被舍棄,若為無符號數(shù),左端補(bǔ)0。例如,將15右移2位,結(jié)果為3。如圖11.20 0 0 0 1 1 1 10 0 0 0 0 0 1 1右移2位圖11.2 15右移3位得到1 右移1位相當(dāng)于該數(shù)除以2,右移n位相當(dāng)于該數(shù)除以2 n ,因此,將15右移3位,相當(dāng)于15/2 2 = 3(C語言規(guī)定整數(shù)相除商為整數(shù))。. 右移時應(yīng)注意符號問題。對于無符號數(shù),右移時左端補(bǔ)0。對于有符號數(shù),若符號位為0(該數(shù)為正),則右移時左端補(bǔ)0,同無符號數(shù)的處理。若符號位為1(該數(shù)為負(fù)),則右移時左端是補(bǔ)0還是補(bǔ)1,取決于所用的計(jì)算機(jī)系

5、統(tǒng)。有的系統(tǒng)左端補(bǔ)0,稱邏輯右移;左端補(bǔ)1,稱算術(shù)右移。顯然,兩種方式所得的結(jié)果是不一樣的。Turbo C采用的是算術(shù)右移。例如:a: 1111111111101111(補(bǔ)碼,其十進(jìn)制數(shù)是-17)a3 11101(邏輯右移,高位補(bǔ)0)a3 1111111111111101(算術(shù)右移,其十進(jìn)制數(shù)是-3).12.2 12.2 程序舉例程序舉例 例例12. 1 取一個無符號數(shù)的4 7位。設(shè)無符號數(shù)用2個1)字節(jié)存儲。 解題思路:(右移4位,使要取出的位移到最右端。如圖11. 3所示 157403015(2)根據(jù)提取指定位的方法,和01111(十六進(jìn)制數(shù)0 x000F)進(jìn)行位與運(yùn)算,程序如下: 圖11

6、. 3 兩個字節(jié)的無符號數(shù)右移4位 .# include main( ) unsigned a , b ;scanf (”%u” , & a ) ;b=a 4 ;b=b & 0 x000F; printf (” na=%u b=%u ”, a , b ) ;運(yùn)行情況如下:115a=115,b=701110011 115 00000111&00001111 00000111.例例12. 2 循環(huán)移位。要求將一個無符號數(shù)進(jìn)行左循環(huán)移位。如圖12. 4所示。將a左移1位,并將移出位補(bǔ)到右端,輸入e 結(jié)束。 圖12. 4 無符號數(shù)左循環(huán)移位 .說明:此題很有實(shí)用意義。公共場合(

7、如車站)發(fā)布信息的顯示屏上滾動顯示的信息,就是通過對顯示緩沖區(qū)做類似處理來實(shí)現(xiàn)的。解題步驟:(1)提取最高位。(2)根據(jù)最高位為0還是1,設(shè)置標(biāo)志變量為0或非0。(3)根據(jù)標(biāo)志變量的值,給最低位置0(左移時右端補(bǔ)0,此步可省略)或置1。(4)重復(fù)以上步驟,直到有鍵按下。程序如下: .# include main( ) unsigned a ; int flag ; scanf (”%u” , & a ) ;while (getchar( ) != e ) flag=a & 0 x8000 ; a=a1 ; if ( flag )a=a | 0 x0001 ;printf (”

8、na=%u ” , a ) ;輸入135 100001111000 0000 0000 0000 80000000 0000 0000 0001 0001.運(yùn)行情況如下:135 ea=270.12.3 12.3 位段結(jié)構(gòu)位段結(jié)構(gòu) 位段結(jié)構(gòu)也是一種結(jié)構(gòu)體類型,只不過其中含有以位為單位定義存儲長度的整數(shù)類型位段成員。在某些應(yīng)用中,特別是對硬件端口的操作,需要標(biāo)志某些端口的狀態(tài)或特征。而這些狀態(tài)或特征只需要一個機(jī)器字中的一位或連續(xù)若干位來表示。采用位段結(jié)構(gòu)既節(jié)省存儲空間,又可方便操作。.位段結(jié)構(gòu)中位段的定義格式為:unsigned :例如:struct bytedata unsigneda:2;/*

9、位段a,占2位*/unsigned:6;/*無名位段,占6位,但不能訪問*/unsigned:0;/*無名位段,占0位,表示下一位段從下一字邊界開始unsignedb:10;/*位段b,占10位*/int i;/*成員i,從下一字邊界開始*/data;. 對16位的Turbo C2.0而言,data變量的內(nèi)存分配示意圖見圖12.5。 位段a 無位段名 未用 位段b 未用 成員i 2位 6位 8位 10位 6位 16位 低地址 高地址 圖12.5 data變量的內(nèi)存分配示意圖. 應(yīng)該注意的是,16位的Turbo C 2.0的字邊界在2倍字節(jié)處,其他的C語言的字邊界可能在若干倍字節(jié)處(如Visua

10、lC+6.0在4倍字節(jié)處)。位段數(shù)據(jù)的引用,同結(jié)構(gòu)體成員中的數(shù)據(jù)引用一樣,但應(yīng)注意位段的最大取值范圍不要超出二進(jìn)制位數(shù)確定的范圍,否則超出部分會丟棄。.關(guān)于位段數(shù)據(jù),注意以下幾點(diǎn):(1)一個位段必須存儲在同一存儲單元(即字)之中,不能跨兩個單元。如果其單元空間不夠,則剩余空間不用,從下一個單元起存放該位段。(2)可以通過定義長度為0的位段的方式使下一位段從下一存儲單元開始。(3)可以定義無名位段。(4)位段的長度不能大于存儲單元的長度。(5)位段無地址,不能對位段進(jìn)行取地址運(yùn)算。(6)位段可以以d,o,x格式輸出。 (7)位段若出現(xiàn)在表達(dá)式中,將被系統(tǒng)自動轉(zhuǎn)換成整數(shù)。 .例12.3 試編一個程

11、序,將一個16進(jìn)制整數(shù)(占2字節(jié))的各位循環(huán)左移4個二進(jìn)制位,如2fel循環(huán)左移4個二進(jìn)制位后為fe12??上热〕?6進(jìn)制整數(shù)的最高4個二進(jìn)制位,然后將該整數(shù)左移4個二進(jìn)制位,最后將先前取出的最高4個二進(jìn)制位放入低4個二進(jìn)制位位置。具體步驟為:(1)取出16進(jìn)制整數(shù)x的最高4個二進(jìn)制位至y:y=x(16-4)&0 xf。(2)將該整數(shù)x(占2字節(jié))左移4個二進(jìn)制位:x=(x4)&0 xffff。 (3)將先前取出的最高4個二進(jìn)制位放入低4個二進(jìn)制位:x=x|y。 .程序如下:#include main( ) int x,y;printf(”n請輸入16進(jìn)制整數(shù):”);scanf(”%x”,&

溫馨提示

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

評論

0/150

提交評論