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

下載本文檔

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

文檔簡介

2024/11/9本章重點6種基本位運算符的使用及其功能位運算符的綜合使用位段的理解和應(yīng)用2024/11/9請寫出47的二進制形式請寫出-47的二進制數(shù)形式提示:1、在計算機中,數(shù)值一律以補碼表示2、絕對值相同的數(shù),原碼除符號位外都相同3、正數(shù)的補碼、原碼、反碼相同4、負數(shù)的補碼,是原碼的反碼加1注意:最高位是符號位,1表示負數(shù),0表示正數(shù)整數(shù)的二進制表示2024/11/9整數(shù)的二進制表示求負數(shù)-47的補碼原碼:反碼:補碼:2024/11/9位與字節(jié)76543210

高低一個字節(jié)由8個二進制位(bit)構(gòu)成,一個位的取值為0或1。最右端的那一位是“最低位”,編號為0;最左端的那一位稱為“最高位”,是符號位,從最低位到最高位按順序依次編號。2024/11/9位運算符1、按位與(&)

0&0=0,0&1=0,1&1=1該位只要有一個0便為0計算:

00000011(3)

&00000101(5)

(-3)?&(-5)??

00000001(1)2024/11/9按位與的用途

(1)清零(用0相&)

11011001&1111000011010000

(2)保留指定位(用1相&)

01010100&0011101100010000

(3)用來檢測某個位是否置位(用1相&)2024/11/9例:有一數(shù)據(jù)b,想測試其第4位是否為1?分析:

1.位號是從右向左數(shù)的

2.設(shè)置一個只有第4位為1的二進制數(shù)a:00010000,與b進行與運算,如果結(jié)果為00010000,則第4位為1;反之結(jié)果為00000000,則第4位為0。2024/11/92、按位或(|)0|0=0,0|1=1,1|1=1該位只要有一個1便為1按位或的用途:(1)置位:用1去跟某些位或,使某些位為1,如:

11011001|0000111111011111

(2)保留原位:用0去跟某些位或,如上例前4位2024/11/93、異或(^)0^0=0,0^1=1,1^1=0異號為1(真),同號為0(假)異或運算符的用途:(1)任何數(shù)與本身異或,則為010101111^1010111100000000(2)與0異或,則保留原值。

10101111^00000000101011112024/11/9(3)與-1異或,相當(dāng)于將各位取反(因為-1的每個位都為1)。

10101111^11111111(-1)01010000(4)特定位翻轉(zhuǎn)。將需要翻轉(zhuǎn)的位與1異或即可。

01111010^0000111101110101

2024/11/9(5)交換兩個值,不用臨時變量。例:a=3,b=4,將a和b的值互換,可以用以下賦值語句實現(xiàn):

a=a^b;b=b^a;a=a^b;a=011^b=100a=111^b=100b=011^a=111a=100最后,a=100(4)b=011(3)

實現(xiàn)了交換2024/11/9|&^000110110001011011102024/11/94、取反(~)~0=1,~1=0舉例:使16位整數(shù)a最低位為0分析:

a&1111111111111110保留前15位,將最低位清零;

1111111111111110這個數(shù)值為多少,較難運算;

1111111111111110=~00000000000000010000000000000001的值較為簡單,就是1;所以可以用:a=a&~1的表達式達到要求。2024/11/95、左移運算符(<<)左移n位,右補n個0。左移n位相當(dāng)于乘以2^n,左移位運算速度比乘法快。但是,左移位可能溢出,實際結(jié)果不會超出指定的整數(shù)類型的值域。unsignedcharx=37<<3; 00100101

(37)<<3

00101000 (40)2024/11/96、右移運算符(>>)右移n位相當(dāng)于除以2^n,右移位運算速度比除法快。

00001111>>2

00000011注意:無符號數(shù):右移時左邊補0;有符號數(shù):非負整數(shù)——右移位時左邊補0;負整數(shù)——邏輯右移:左邊補0;算術(shù)右移:左邊補12024/11/9檢查一下你所用的計算機系統(tǒng)的C編譯系統(tǒng)執(zhí)行的是邏輯右移還是算術(shù)右移:程序代碼:#include<stdio.h>voidmain(){ inta=~0,b; b=a>>1;if(b==a)printf(“算術(shù)右移!\n”);elseprintf(“邏輯右移!\n”);}若b仍為~0,則表明采用的是算術(shù)右移,反之為邏輯右移。2024/11/9位運算符功能總結(jié)清位(置0):跟0(若非說明,指指定位的值)相&置位(置1):跟1相|檢測某位是否為1:跟1相&保留原位:跟1相&,或者跟0相|翻轉(zhuǎn)某位:跟1相^2024/11/9位運算綜合運用舉例例12.1:取一個整數(shù)a從右端開始的4~7位。31876543210313043210在中間取位比較麻煩,最好將該4位移到最低位,方便操作a>>4即:找一個數(shù)與(a>>4)進行運算,需要保留第四位,而使其余位清零2024/11/9設(shè)置一個最低四位均為1而其余位為0的數(shù)與之進行按位與運算,能夠保留最低四位

0:0000….00000~0:1111…..11111~0<<4:1111…..10000為什么不直接右移?~(~0<<4):0000…...01111將(a>>4)跟(~(~0<<4))進行與運算,便可保留4~7位2024/11/9例12.2:右循環(huán)移位假設(shè)用無符號短整型存放數(shù)據(jù):a(16-n)位n位

bn位(16-n)位2024/11/9例12.2:右循環(huán)移位假設(shè)用無符號短整型存放數(shù)據(jù):a(16-n)位n位c

先取右端n位,放到最高位上:c=a<<(16-n);

2024/11/9例12.2:右循環(huán)移位假設(shè)用無符號短整型存放數(shù)據(jù):a(16-n)位n位c

d

然后取左端(16-n)位,放到低位:d=a>>n先取右端n位,放到最高位上:c=a<<(16-n);2024/11/9例12.2:右循環(huán)移位假設(shè)用無符號短整型存放數(shù)據(jù):a

(16-n)位n位c

dbn位(16-n)位

然后取左端(16-n)位,放到低位:d=a>>n先取右端n位,放到最高位上:c=a<<(16-n);b=c|d2024/11/9對于無符號整數(shù),總長度N(81632),則可以歸納為:循環(huán)右移n:(a>>n)|(a<<(N-n))循環(huán)左移n:(a<<n)|(a>>(N-n))2024/11/9用二進制位存儲信息:將動詞“看見”的這六種語法屬性存入一個字節(jié),則表示如下:這個字節(jié)的值就是2+16+32=50。未用未用__過__了__著很__沒__不__00xxxxxx未用未用__過__了__著很__沒__不__001100102024/11/9位段位段(bitfield),就是結(jié)構(gòu)(struct)中的一種字段(成員),這種成員是以二進制位作為長度單位的。動詞屬性可定義為如下一個結(jié)構(gòu):structVerbAttr{ unsignedshortBu_:1; unsignedshortMei_:1; unsignedshortHen_:1; unsignedshort_Zhe:1; unsignedshort_Le:1; unsignedshort_Guo:1; }v;2024/11/9結(jié)構(gòu)中可以同時定義位段和其他字段。例如,重新定義動詞屬性結(jié)構(gòu)如下:structVerbAttr{ unsignedshortBu_:1; unsignedshortMei_:1; unsignedshortHen_:1; unsignedshort_Zhe:1; unsignedshort_Le:1; unsignedshort_Guo:1;charverb[9]; }v;

該結(jié)構(gòu)的理論長度為1*2+1*9=11個字節(jié),但為了對齊,墊補了一個字節(jié),這時v的長度是12個字節(jié)。2024/11/9對位段中的數(shù)據(jù)引用的方法同樣可以用成員運算符“.”和指向成員運算符“->”,如

v.Bu_=1; p->Hen_=0;對位段進行賦值時需要注意其允許的最大值范圍,如對結(jié)構(gòu)

struct{unsignedshorta:2;unsignedshortb:3;unsignedshortc:4;inti;}data;

寫賦值語句data.a=8后,位段a的值為多少?2024/11/9關(guān)于位段的說明1、位段成員的類型必須指定為unsigned或int類型;2、可定義長度為0的位段,使某一位段從另一個字開始存放,如下:struct{unsignedshorta:1;unsignedshortb:2;unsignedshort:0;unsignedshortc:3;}data;data的

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論