C語言程序設(shè)計課件位運算_第1頁
C語言程序設(shè)計課件位運算_第2頁
C語言程序設(shè)計課件位運算_第3頁
C語言程序設(shè)計課件位運算_第4頁
C語言程序設(shè)計課件位運算_第5頁
已閱讀5頁,還剩29頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、位運算課程:程序設(shè)計語言教材:譚浩強C程序設(shè)計第三版講授:陳慧煒10/10/2022位運算課程:程序設(shè)計語言10/9/2022本章重點6種基本位運算符的使用及其功能位運算符的綜合使用位段的理解和應(yīng)用10/10/2022本章重點6種基本位運算符的使用及其功能10/9/2022請寫出47的二進(jìn)制形式請寫出-47的二進(jìn)制數(shù)形式提示:1、在計算機中,數(shù)值一律以補碼表示2、絕對值相同的數(shù),原碼除符號位外都相同3、正數(shù)的補碼、原碼、反碼相同4、負(fù)數(shù)的補碼,是原碼的反碼加1注意:最高位是符號位,1表示負(fù)數(shù),0表示正數(shù)整數(shù)的二進(jìn)制表示10/10/2022請寫出47的二進(jìn)制形式請寫出-47的二進(jìn)制數(shù)形式提示:注

2、意:整數(shù)的二進(jìn)制表示求負(fù)數(shù)-47的補碼原碼:反碼:補碼:10/10/2022整數(shù)的二進(jìn)制表示求負(fù)數(shù)-47的補碼10/9/2022位與字節(jié)76543210 高 低一個字節(jié)由8個二進(jìn)制位(bit)構(gòu)成,一個位的取值為0或1。最右端的那一位是“最低位”,編號為0;最左端的那一位稱為“最高位”,是符號位,從最低位到最高位按順序依次編號。10/10/2022位與字節(jié)76543210 高 位運算符1、按位與(&) 0&0=0,0&1=0,1&1=1該位只要有一個0便為0計算: 00000011 (3) & 00000101 (5) (-3) ?&(-5) ? ? 00000001 (1)10/10/202

3、2位運算符1、按位與(&) (-3) ?0000000按位與的用途 (1)清零(用0相&) 11011001 & 11110000 11010000 (2)保留指定位(用1相&) 01010100 & 00111011 00010000 (3)用來檢測某個位是否置位(用1相&)10/10/2022按位與的用途 (1)清零(用0相&)10/9/2022例:有一數(shù)據(jù)b,想測試其第4位是否為1?分析: 1.位號是從右向左數(shù)的 2. 設(shè)置一個只有第4位為1的二進(jìn)制數(shù)a:00010000,與b進(jìn)行與運 算,如果結(jié)果為00010000,則第4位為1;反之結(jié)果為00000000,則第4位為0。10/10/2

4、022例:有一數(shù)據(jù)b,想測試其第4位是否為1?10/9/20222、按位或(|) 0|0=0,0|1=1,1|1=1該位只要有一個1便為1按位或的用途: (1)置位:用1去跟某些位或,使某些位為1,如: 11011001 | 00001111 11011111 (2)保留原位:用0去跟某些位或,如上例前4位10/10/20222、按位或(|) 0|0=0,0|1=1,1|1=110/93、異或() 00=0,01=1,11=0異號為1(真),同號為0(假)異或運算符的用途:(1)任何數(shù)與本身異或,則為0 10101111 10101111 00000000(2)與0異或,則保留原值。 1010

5、1111 00000000 1010111110/10/20223、異或() 00=0,01=1,11=010/9/(3)與-1異或,相當(dāng)于將各位取反(因為-1的每個位都為1)。 10101111 11111111 (-1) 01010000(4)特定位翻轉(zhuǎn)。將需要翻轉(zhuǎn)的位與1異或即可。 01111010 00001111 01110101 10/10/2022(3)與-1異或,相當(dāng)于將各位取反(因為-1的每個位都為1)(5)交換兩個值,不用臨時變量。 例:a=3,b=4,將a和b的值互換,可以用以下賦值語句實現(xiàn): a=ab;b=ba;a=ab; a=011 b=100 a=111 b=100

6、 b=011 a=111 a=100最后,a=100 (4) b=011 (3) 實現(xiàn)了交換10/10/2022(5)交換兩個值,不用臨時變量。10/9/2022 | & 0 0 0 1 1 0 1 1 0 0 0 1 0 1 1 0 1 1 1 010/10/2022 | & 4、取反() 0=1,1=0 舉例:使16位整數(shù)a最低位為0 分析: a&1111111111111110 保留前15位,將最低位清零; 1111111111111110這個數(shù)值為多少,較難運算; 1111111111111110 =0000000000000001 0000000000000001的值較為簡單,就是1

7、; 所以可以用:a=a&1的表達(dá)式達(dá)到要求。 10/10/20224、取反() 0=1,1=0 10/9/20225、左移運算符() 左移n位,右補n個0。左移n位相當(dāng)于乘以2n,左移位運算速度比乘法快。但是,左移位可能溢出,實際結(jié)果不會超出指定的整數(shù)類型的值域。 unsigned char x = 37 3 ;00100101(37)300101000(40)10/10/20225、左移運算符() 右移n位相當(dāng)于除以2 n,右移位運算速度比除法快。 000011112 00000011注意: 無符號數(shù):右移時左邊補0; 有符號數(shù):非負(fù)整數(shù)右移位時左邊補0; 負(fù)整數(shù)邏輯右移:左邊補0; 算術(shù)右

8、移:左邊補1 10/10/20226、右移運算符() 右移n位相當(dāng)于除以2 n,右移位運檢查一下你所用的計算機系統(tǒng)的C編譯系統(tǒng)執(zhí)行的是邏輯右移還是算術(shù)右移:程序代碼:#includevoid main( )int a=0,b;b=a1; if(b=a)printf(“算術(shù)右移!n”); else printf(“邏輯右移!n”);若b仍為0,則表明采用的是算術(shù)右移,反之為邏輯右移。10/10/2022檢查一下你所用的計算機系統(tǒng)的C編譯系統(tǒng)執(zhí)行的是邏輯右移還是算位運算符功能總結(jié) 清位(置0):跟0(若非說明,指指定位的值)相&置位(置1):跟1相|檢測某位是否為1:跟1相&保留原位:跟1相&,或

9、者跟0相|翻轉(zhuǎn)某位:跟1相10/10/2022位運算符功能總結(jié) 清位(置0):跟0(若非說明,指指定位的值位運算綜合運用舉例 例12.1:取一個整數(shù)a從右端開始的47位。31876543210313043210在中間取位比較麻煩,最好將該4位移到最低位,方便操作a4即: 找一個數(shù)與(a4)進(jìn)行運算,需要保留第四位,而使其余位清零10/10/2022位運算綜合運用舉例 例12.1:取一個整數(shù)a從右端開始的4設(shè)置一個最低四位均為1而其余位為0的數(shù)與之進(jìn)行按位與運算,能夠保留最低四位 0: 0000.00000 0: 1111.11111 04: 1111.10000 為什么不直接右移?(04)跟(

10、04)進(jìn)行與運算,便可保留47位10/10/2022設(shè)置一個最低四位均為1而其余位為0的數(shù)與之進(jìn)行按位與運算,能例12.2:右循環(huán)移位 假設(shè)用無符號短整型存放數(shù)據(jù):a (16-n)位 n位 b n位 (16-n)位 10/10/2022例12.2:右循環(huán)移位 假設(shè)用無符號短整型存放數(shù)據(jù):10/9例12.2:右循環(huán)移位 假設(shè)用無符號短整型存放數(shù)據(jù):a (16-n)位 n位c 先取右端n位,放到最高位上:c=an先取右端n位,放到最高位上:c=an先取右端n位,放到最高位上:c=an) |(a(N-n)循環(huán)左移n: (a(N-n)10/10/2022對于無符號整數(shù),總長度N(8 16 32),則可

11、以歸納為:1用二進(jìn)制位存儲信息:將動詞“看見”的這六種語法屬性存入一個字節(jié),則表示如下: 這個字節(jié)的值就是2163250。 未用未用_過_了_著很_沒_不_00 xxxxxx未用未用_過_了_著很_沒_不_0011001010/10/2022用二進(jìn)制位存儲信息:未用未用_過_了_著很_沒_不位 段 位段(bit field),就是結(jié)構(gòu)(struct)中的一種字段(成員),這種成員是以二進(jìn)制位作為長度單位的。動詞屬性可定義為如下一個結(jié)構(gòu): struct VerbAttrunsigned short Bu_ : 1 ;unsigned short Mei_ : 1 ;unsigned short

12、Hen_ : 1 ;unsigned short _Zhe : 1 ;unsigned short _Le : 1 ;unsigned short _Guo : 1 ; v;10/10/2022位 段 位段(bit field),就是結(jié)構(gòu)(struct)結(jié)構(gòu)中可以同時定義位段和其他字段。例如,重新定義動詞屬性結(jié)構(gòu)如下:struct VerbAttrunsigned short Bu_ : 1 ;unsigned short Mei_ : 1 ;unsigned short Hen_ : 1 ;unsigned short _Zhe : 1 ;unsigned short _Le : 1 ;un

13、signed short _Guo : 1 ; char verb 9 ; v; 該結(jié)構(gòu)的理論長度為1*2+1*9=11個字節(jié),但為了對齊,墊補了一個字節(jié),這時v的長度是12個字節(jié)。 10/10/2022結(jié)構(gòu)中可以同時定義位段和其他字段。例如,重新定義動詞屬性結(jié)構(gòu)對位段中的數(shù)據(jù)引用的方法同樣可以用成員運算符“.”和指向成員運算符“-”,如 v.Bu_ = 1 ;p-Hen_ = 0; 對位段進(jìn)行賦值時需要注意其允許的最大值范圍,如對結(jié)構(gòu) struct unsigned short a:2; unsigned short b:3; unsigned short c:4; int i; data;

14、 寫賦值語句 data.a=8 后,位段a 的值為多少?10/10/2022對位段中的數(shù)據(jù)引用的方法同樣可以用成員運算符“.”和指向成員關(guān)于位段的說明 1、位段成員的類型必須指定為unsigned 或int 類型;2、可定義長度為0的位段,使某一位段從另一個字開始存放,如下:struct unsigned short a: 1; unsigned short b: 2; unsigned short : 0; unsigned short c :3;data; data的長度是 幾個字節(jié)?10/10/2022關(guān)于位段的說明 1、位段成員的類型必須指定為unsigned關(guān)于位段的說明3、可定義無

15、名位段,表明該幾位空間不用: struct unsigned short a : 1; unsigned short : 1; / 無名位段,這兩位空間不用 unsigned short b : 3; unsigned short c : 3;data;10/10/2022關(guān)于位段的說明3、可定義無名位段,表明該幾位空間不用:10/關(guān)于位段的說明4、一個位段不能跨單元存儲。如果第一個單元空間不能容納下一個位段,則放棄該空間,而從下一個單元起存放該位段。5、因為最小的存儲單位是字節(jié),所以不允許取位段的地址。6、位段也只能在結(jié)構(gòu)中定義,二進(jìn)制位數(shù)組、返回二進(jìn)制位的函數(shù)、二進(jìn)制位的指針都是不允許的7、位段可以用整型格式符輸出。例如: printf(“%d,%d,%d”,data.a,data.b,data.c);8、位段可以在數(shù)值表達(dá)式中引用,它會被系統(tǒng)自動地轉(zhuǎn)換成整型數(shù)。10/10/2022關(guān)于位段的說明4、一個

溫馨提示

  • 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

提交評論