版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第九章 位運(yùn)算位運(yùn)算概述位運(yùn)算使用方法位運(yùn)算使用舉例位域9.1 位運(yùn)算概述u計(jì)算機(jī)中數(shù)的表示原碼反碼補(bǔ)碼u硬件接口寄存器位的讀取9.1.1 計(jì)算機(jī)中數(shù)的表示u原碼u反碼u補(bǔ)碼原碼表示數(shù)的最高位用來(lái)表示數(shù)的符號(hào),稱(chēng)為號(hào)表示數(shù)的最高位用來(lái)表示數(shù)的符號(hào),稱(chēng)為號(hào)位。當(dāng)符號(hào)位為位。當(dāng)符號(hào)位為1時(shí),表示負(fù)數(shù);當(dāng)符號(hào)位時(shí),表示負(fù)數(shù);當(dāng)符號(hào)位為為0時(shí),表示正數(shù)。其他位表示數(shù)。時(shí),表示正數(shù)。其他位表示數(shù)?!纠?1.1】.設(shè)a=15,b=-68,求a,b的原碼。假設(shè)用8位二進(jìn)制位表示數(shù) 解:將a,b用二進(jìn)制表示: a=00001111,b=-01000100則a,b的原碼為:a原=00001111,b原=1100
2、0100 反碼反碼的表示規(guī)則是:正數(shù)的反碼就是這個(gè)數(shù)的二進(jìn)制數(shù)本身;如果是負(fù)數(shù),除符號(hào)位外,其他各位如果二進(jìn)制數(shù)是1,則變?yōu)?,如果是0,則變?yōu)??!纠?1.2】. 設(shè)a=15,b=-68,求a,b的反碼表示。解:a,b的二進(jìn)制數(shù)為:a=00001111,b=-01000100所以a反=00001111,b反=10111011. 補(bǔ)碼計(jì)算機(jī)數(shù)補(bǔ)碼表示的規(guī)則是:正數(shù)的補(bǔ)碼就是它本身;負(fù)數(shù)的補(bǔ)碼的符號(hào)位為1,數(shù)據(jù)位是它的反碼在最末位加1而得到的。 【例11.3】. 設(shè)a=15,b=-68,求a,b的補(bǔ)碼。解:a,b的二進(jìn)制數(shù)為:a=00001111,b=-01000100所以 a補(bǔ)=0000111
3、1,b補(bǔ)=10111100.求補(bǔ)碼的步驟(1)寫(xiě)出該數(shù)的原碼; (2)除符號(hào)位外,按位取反(即如果原碼是1,則變?yōu)?;如果原碼為0,則變?yōu)?) (3)末位加1。 9.1.2 硬件接口寄存器位的讀取與設(shè)置1=按下右移鍵(Right Shift)1=Insert鍵狀態(tài)已改變1=按下控制鍵(Ctrl)1=按下交替鍵(Alt)1=按下右移鍵(Right Shift)1=CapsLock鍵狀態(tài)已改變1=NumLock鍵狀態(tài)已改變1=ScrollLock鍵狀態(tài)已改變圖9.1 鍵盤(pán)狀態(tài)接口寄存器9.2 位運(yùn)算使用方法u按位與運(yùn)算u按位或運(yùn)算u按位異或運(yùn)算u按位取反運(yùn)算u左移運(yùn)算u右移運(yùn)算9.2.1 按位與運(yùn)
4、算位與運(yùn)算是一種雙目運(yùn)算,有兩個(gè)操作數(shù)。運(yùn)算符為&。對(duì)于一位二進(jìn)制的位與運(yùn)算,其規(guī)則如下: 位與01000101表9.1 位與運(yùn)算規(guī)則 按位與運(yùn)算要注意邏輯與運(yùn)算的運(yùn)算符號(hào)為&,而位與運(yùn)算的運(yùn)算符號(hào)為&。 【例11.4】.已知a=-1,b=15,試求a&b的值。假設(shè)a,b都是8位的整數(shù)。 11111111(-1的補(bǔ)碼)解:a,b的補(bǔ)碼分別是a補(bǔ)=11111111,b補(bǔ)=00001111,a&b=00001111=15.& 00001111(15的補(bǔ)碼) 11111111 00001111【例11.5】 閱讀程序,寫(xiě)出程序執(zhí)行結(jié)果:main() c
5、har a=-3,b=50; printf(“a&b=%0 xn”,a&b);程序執(zhí)行結(jié)果顯示為: a&b=30按位與運(yùn)算的運(yùn)算符&與取地址操作符相同,但要注意,兩者的意義完全不同。取地址符是單目操作符,表示取操作數(shù)的內(nèi)存地址;按位與運(yùn)算符是雙目運(yùn)算符,表示對(duì)這兩個(gè)操作數(shù)進(jìn)行位與運(yùn)算。如a&b表示是按位與運(yùn)算,而int *p;int a;p=&a ;則表示取地址操作符9.2.2 按位或運(yùn)算按位或運(yùn)算按位或運(yùn)算是一種雙目運(yùn)算,有兩個(gè)操作數(shù)。運(yùn)算符為|。對(duì)于一位二進(jìn)制的位或運(yùn)算,其規(guī)則如下: 位或01001111表9.2 位或運(yùn)算規(guī)則注意邏輯或運(yùn)算的
6、運(yùn)算符號(hào)為|,而位或運(yùn)算的運(yùn)算符號(hào)為|。 如a|b表示是作邏輯或運(yùn)算,而a|b表示是按位或運(yùn)算,二者結(jié)果是不一樣的?!纠?1.6】.已知a=69,b=23,試求a|b的值。假設(shè)a,b都是8位的整數(shù)。 01000101(69的補(bǔ)碼)解:a,b的補(bǔ)碼分別是a補(bǔ)=01000101,b補(bǔ)=00010111,a|b=01010111=87.| 00010111(23的補(bǔ)碼) 01010111 01010111【例11.7】. 閱讀程序,寫(xiě)出程序執(zhí)行結(jié)果:main() char a=64,b=51; printf(“a|b=%0 xn”,a|b);程序執(zhí)行結(jié)果顯示為: a|b=69思考一下:a|b的結(jié)果為
7、多少。9.2.3 按位異或運(yùn)算按位異或運(yùn)算按位異或運(yùn)算是一種雙目運(yùn)算,有兩個(gè)操作數(shù)。運(yùn)算符為。對(duì)于一位二進(jìn)制的按位異或運(yùn)算,其規(guī)則如下: 表9.3 按位異或運(yùn)算規(guī)則異或01001110【例11.8】.已知a=-1,b=15,試求ab的值。假設(shè)a,b都是8位的整數(shù)。 11111111(-1的補(bǔ)碼)解:a,b的補(bǔ)碼分別是a補(bǔ)=11111111,b補(bǔ)=00001111,ab=11110000=-16 00001111(15的補(bǔ)碼) 11111111 11110000【例11.9】. 閱讀程序,寫(xiě)出程序執(zhí)行結(jié)果:main() char a=-3,b=50; printf(“ab=%0dn”,ab);程
8、序執(zhí)行結(jié)果顯示為: ab=-499.2.4 按位取反運(yùn)算按位取反運(yùn)算按位異或運(yùn)算是一種單目運(yùn)算,只有一個(gè)操作數(shù)。運(yùn)算符為。對(duì)于一位二進(jìn)制的按位取反運(yùn)算,其規(guī)則如下: 表9.4 按位取反運(yùn)算規(guī)則 按位取反0110從以上規(guī)則可知:0=1,1=0。這與邏輯非運(yùn)算!相類(lèi)似?!纠?1.10】.已知a=-15,試求a的值。假設(shè)a是8位的整數(shù)。 解:a的補(bǔ)碼是a補(bǔ)=11110001a =00001110=14.11110001(-1的補(bǔ)碼) (各位取反) 00001110【例11.11】. 閱讀程序,寫(xiě)出程序執(zhí)行結(jié)果:main() char a=-3,b=50; printf(“a=%d,b=%0dn”,a
9、,b);程序執(zhí)行結(jié)果顯示為: a=2,b=-519.2.5 左移運(yùn)算左移運(yùn)算左移運(yùn)算符為,是一個(gè)雙目運(yùn)算符,其運(yùn)算規(guī)則為:expression1expression2.表示把左邊的expression1向左移動(dòng)右邊的expression2指定的位數(shù),同時(shí)右邊補(bǔ)0。其中expression1的值是一個(gè)整型值或字符型值,不能是實(shí)型,也不能是結(jié)構(gòu)類(lèi)型。Expression2也必須是一個(gè)整型值或字符型值。如果expression1和/或expression2都是字符型值,那么參與運(yùn)算的將是該字符型的ASCII編碼。補(bǔ)01 0 0 1 1 1 0 00 0 1 1 1 0 0 0丟棄-100的補(bǔ)碼56的
10、補(bǔ)碼圖9.2 100左移1位的示意圖其移位過(guò)程解釋見(jiàn)圖9.2??梢?jiàn),在移位操作過(guò)程中,首先把要移位的數(shù)用補(bǔ)碼形式表示,然后依據(jù)左移規(guī)則連同最高位上的符號(hào)位一起向左移動(dòng)指定的位數(shù),并在最右邊補(bǔ)0。 因此這種移位操作可看成是對(duì)無(wú)符號(hào)數(shù)的操作,如果在移位過(guò)程中要保證結(jié)果的符號(hào)仍然同移位前相同,即算術(shù)移位,則需要用戶自己實(shí)現(xiàn)。 【例11.12】寫(xiě)出算術(shù)左移運(yùn)算實(shí)現(xiàn)程序。int larith_shift(int opnd,int shiftnum,int kind) int i,flag=0; switch (kind) case 0:/整數(shù) flag=opnd&0 x80000000;brea
11、k; case 1:/短整型flag=opnd&0 x8000;break; case 2:/字符型flag=opnd&0 x80;break; default:return 1; for(i=0;ishiftnum;i+) opnd也是一種雙目運(yùn)算。其運(yùn)算規(guī)則是:expression1expression2即把表達(dá)式expression1的值向右移expression2所指示的位,在移位過(guò)程中,最右邊的位被移出,并被丟棄;而最左邊的符號(hào)位則在移位過(guò)程中保持不變。這是與左移運(yùn)算不同的地方。對(duì)于一個(gè)正數(shù)當(dāng)右移位數(shù)超過(guò)這個(gè)數(shù)本身的二進(jìn)制數(shù)的位數(shù)時(shí),結(jié)果為0;而對(duì)于一個(gè)負(fù)數(shù),當(dāng)右移位
12、數(shù)超過(guò)其補(bǔ)碼的二進(jìn)制位數(shù)時(shí),結(jié)果為-1。 【例11.13】.閱讀程序,寫(xiě)出執(zhí)行結(jié)果。main() char a=-16,b; b=a2; printf(“a2=%dn”,b);運(yùn)行結(jié)果為:-4補(bǔ)01 0 0 1 1 1 0 01 1 0 0 1 1 1 0丟棄-100的補(bǔ)碼-50的補(bǔ)碼圖9.3 100右移1位的示意圖符 號(hào) 位不變9.3 位運(yùn)算應(yīng)用舉例 各種位運(yùn)算的運(yùn)算順序 綜合舉例9.3.1 各種位運(yùn)算的運(yùn)算順序各種位運(yùn)算的運(yùn)算順序一般地,按照運(yùn)算優(yōu)先級(jí)從高到低的順序,位運(yùn)算的優(yōu)先級(jí)順序如下: 、&、| 當(dāng)然也可用括號(hào)來(lái)改變運(yùn)算的順序,如果沒(méi)有括號(hào),那么在進(jìn)行有多種位運(yùn)算時(shí)必須按優(yōu)先
13、級(jí)順序進(jìn)行。【例11.14】.寫(xiě)一個(gè)程序試判斷是否從鍵盤(pán)中輸入了ctrl+alt+del。 #define R_SHIFT_STATE 0 x01 #define L_SHIFT_STATE 0 x02 #define CTRL_STATE 0 x04 #define ALT_STATE 0 x08 #define VLT_DEL 0 x7F main()unsigned char key_state,key_val;key_state=0 x4c;key_val=VLT_DEL;if(key_state&CTRL_STATE&key_state& ALT_STATE&
14、amp;key_val= =VLT_DEL) printf(“you have press ctrl+alt+del warm start keysn”);執(zhí)行這個(gè)程序時(shí)運(yùn)行結(jié)果為:you have press ctrl+alt+del warm start keys.【例11.15】.位運(yùn)算用于標(biāo)志判定。enumKEYWORD=0X01,EXTERNAL=0X02,STATIC=0X04;main() int flags; printf(“please input a int :n”); scanf(“%d”,&flags); printf(“you input:flags=%dn”
15、,flags); flags |=KEYWORD|STATIC; printf(“after turn on flags:flags=0 x%04xn”,flags); flags &=(KEYWORD|STATIC); printf(“after turn off flags:flags=0 x%04xn”,flags);程序運(yùn)行:8you input:flags=8 after turn on flags:flags=0 x000d after turn off flags:flags=0 x0008 優(yōu)先級(jí)操作符描述結(jié)合性2() . - + - 后綴從左到右結(jié)合3+ - ! !
16、sizeof 單目運(yùn)算符(前綴)從右到左結(jié)合* &間接訪問(wèn)或引用 (指針)+ -單目運(yùn)算:數(shù)的符號(hào)4(type)類(lèi)型轉(zhuǎn)換從右到左結(jié)合5.* -*訪問(wèn)指針成員從左到右結(jié)合6* / %乘除運(yùn)算從左到右結(jié)合7+ -加減運(yùn)算從左到右結(jié)合8移位從左到右結(jié)合9 =關(guān)系從左到右結(jié)合10= !=等于從左到右結(jié)合11& &位與運(yùn)算從左到右結(jié)合12 按位異或從左到右結(jié)合13| |位或從左到右結(jié)合14&邏輯與從左到右結(jié)合15|邏輯或從左到右結(jié)合16?:條件運(yùn)算從右到左結(jié)合17=, *=, /=, %= ,+=, -= ,=, = ,&=, =, != 賦值運(yùn)算從右到左結(jié)合9.
17、3.2 綜合舉例綜合舉例 【例11.16】.寫(xiě)一個(gè)函數(shù)把十進(jìn)制整數(shù)轉(zhuǎn)換為二進(jìn)制整數(shù),并以二進(jìn)制顯示出來(lái)。分析:我們知道,要把一個(gè)十進(jìn)制數(shù)轉(zhuǎn)換為一個(gè)二進(jìn)制數(shù),可以采取如下辦法:除2取余法,但得出的二進(jìn)制數(shù)必須從后向前取其余數(shù);如下所示:從圖9.4可看出,要求出99的二進(jìn)制數(shù),必須用99連續(xù)除以2取余數(shù),而且取余數(shù)時(shí)必須從后往前取,最后得99的二進(jìn)制表示為二進(jìn)制數(shù)1100011。 01361224 99 4922222021100121連續(xù)除以2 余數(shù)圖9.4 除2取余法99的二進(jìn)制數(shù)1100011取數(shù)順序Re=num%2;d=num/2;Bn=bn|re;I=0;D!=0 I+;re=d%2;
18、Bn|=reI; D=d/2;圖9.5 十進(jìn)制轉(zhuǎn)二進(jìn)制流程圖轉(zhuǎn)十進(jìn)制為二進(jìn)制的程序流程圖轉(zhuǎn)十進(jìn)制為二進(jìn)制的程序流程圖其中re表示每次除以2得的余數(shù),d表示每次除以2得的商;I用作計(jì)數(shù)器,bn是轉(zhuǎn)換得到的二進(jìn)制數(shù)。當(dāng)Inum Y bI=1 N 輸出1 輸出0 b=1;I+圖9.6 二進(jìn)制格式輸出流程圖打印二進(jìn)制數(shù)的流程圖打印二進(jìn)制數(shù)的流程圖其中num是整數(shù)b的位數(shù),b是要輸出的整數(shù)。int dec_to_bin(int num) int i,d,re,bn;i=0;bn=0;d=num/2;re=num%2;bn|=re;while(d!=0) i+; re=d%2; bn|=rei; d=d/
19、2;return bn; void print_bin(int b,int size) int I=0; for(I=0;Isize*8;I+) if(b&(1(size*8-1)=1)printf(“1”);else printf(“0”);b=1; 【例11.17】交換短整型的高低兩個(gè)字節(jié)的值。 main() short x,y; char a; printf(please input a integer(65536):n); scanf(%x,&x); y=x&0 xff00; memcpy(&a,(char*)(&y)+1,sizeof(char
20、); x=(xsign,pstatus-parity等等訪問(wèn)相應(yīng)的域成員。無(wú)名位域成員無(wú)名位域成員 不象結(jié)構(gòu)一樣,在結(jié)構(gòu)中不允許存在未命名的成員,但在位域中,允許存在未命名的域成員,稱(chēng)為無(wú)名位域成員。此時(shí)它不能象有名域成員一樣可以被訪問(wèn),它是不可訪問(wèn)的,其主要作用是用來(lái)填充或調(diào)整位域存儲(chǔ)的字節(jié)位置的,使下一個(gè)位域成員從另一個(gè)字節(jié)開(kāi)始存放。 struct bit_fields int a:2; int:3; int b:2; int c:2; ; c b a 圖9.8 未命名位域成員跨字節(jié)位域問(wèn)題跨字節(jié)位域問(wèn)題 位域成員不允許跨存儲(chǔ)單元存放,如果某個(gè)位域成員寬度超過(guò)這個(gè)成員數(shù)據(jù)類(lèi)型規(guī)定的比特?cái)?shù),
21、編譯器將會(huì)報(bào)告錯(cuò)誤。同時(shí)也允許非位域成員與位域成員共存于一個(gè)位域結(jié)構(gòu)中。訪問(wèn)方式不變。但可允許在一個(gè)字節(jié)內(nèi)存儲(chǔ)多個(gè)位域成員。 struct k1unsigned a:1;unsigned :2; /*該2位不能使用*/unsigned b:3;unsigned c:2;int x;其中成員x是一個(gè)正常的結(jié)構(gòu)成員,而其他成員是位域成員,這個(gè)混合結(jié)構(gòu)所占存儲(chǔ)空間等于位域成員所占空間加x所占存儲(chǔ)空間。位域成員數(shù)據(jù)類(lèi)型位域成員數(shù)據(jù)類(lèi)型由于位域成員是一些比特位,所以其成員的數(shù)據(jù)類(lèi)型只能為char,short,int或相應(yīng)的無(wú)符號(hào)類(lèi)型,不能為實(shí)數(shù)類(lèi)型或字符串類(lèi)型或結(jié)構(gòu)類(lèi)型。而且在寫(xiě)位域成員時(shí)要注意不要超過(guò)
22、位域成員所占比特?cái)?shù)的取值范圍。 位域成員的輸出位域成員的輸出如果要格式化輸出位域成員的值,那么可用printf的格式控制串:%d,%u,%o,%x等等,和一般的整數(shù)輸出相同。main()struct bsunsigned a:1;unsigned b:3;unsigned c:4; bit,*pbit;char x;bit.a=1;bit.b=7;bit.c=15;printf(%d,%d,%dn,bit.a,bit.b,bit.c);x=0;memcpy(&x,(char*)&bit,sizeof(char);/*將位域的各位拷貝到變量x中*/printf(0.x=0 x%x,x=%dn,x,x);pbit=&bit;pbit-a=0;pbit-b&=3;pbit-c|=1;printf(%d,%d,%dn,pbit-a,pbit-b,pbit-c);x=0;memcpy(&x,(char*)pbit,sizeof(char); /*將位域的各位
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 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ì)用戶上傳內(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025版通信網(wǎng)絡(luò)建設(shè)投標(biāo)承諾書(shū)規(guī)范范本3篇
- 能源化工行業(yè)營(yíng)業(yè)員工作總結(jié)
- 人教版五年級(jí)數(shù)學(xué)上冊(cè)第3單元《小數(shù)除法》聽(tīng)評(píng)課記錄
- 釣魚(yú)場(chǎng)租賃合同三篇
- 二零二五版私人民間借貸金錢(qián)合同抵押品管理細(xì)則3篇
- 二零二五年度企業(yè)團(tuán)建活動(dòng)策劃與戶外拓展合同3篇
- 二零二五年度節(jié)能減排項(xiàng)目管理合同3篇
- 娛樂(lè)行業(yè)技術(shù)崗位總結(jié)
- 二零二五年度魚(yú)塘承包及漁村旅游開(kāi)發(fā)合同2篇
- 二零二五年度公司內(nèi)部借款及資金管理協(xié)議4篇
- 元素的用途完整版本
- 七十歲換領(lǐng)證駕考三力測(cè)試答題
- 2024版義務(wù)教育小學(xué)數(shù)學(xué)課程標(biāo)準(zhǔn)
- Nokia銷(xiāo)售五部曲培訓(xùn)課件
- 服務(wù)人員隊(duì)伍穩(wěn)定措施
- 支氣管鏡護(hù)理測(cè)試題
- 大連理工大學(xué)信封紙
- 圖形創(chuàng)意(高職藝術(shù)設(shè)計(jì))PPT完整全套教學(xué)課件
- 北京版小學(xué)英語(yǔ)必背單詞
- 2023年全國(guó)4月高等教育自學(xué)考試管理學(xué)原理00054試題及答案新編
- 稀土配合物和量子點(diǎn)共摻雜構(gòu)筑發(fā)光軟材料及其熒光性能研究
評(píng)論
0/150
提交評(píng)論