資源描述:
《第11章 位運(yùn)算》由會員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫。
1、第10章位運(yùn)算11.1位運(yùn)算符11.2位段11.3應(yīng)用舉例11.1位運(yùn)算符當(dāng)兩個(gè)運(yùn)算對象的位數(shù)不同時(shí),系統(tǒng)將自動進(jìn)行如下處理:先將兩個(gè)運(yùn)算數(shù)右端對齊。再將位數(shù)不足的一個(gè)運(yùn)算對象向高位擴(kuò)充,即:無符號數(shù)和正整數(shù)左端用0補(bǔ)齊;負(fù)數(shù)左端用1補(bǔ)齊;然后對位數(shù)相等的這兩個(gè)數(shù)按位進(jìn)行運(yùn)算?!鞍次慌c”運(yùn)算(&)“按位與”運(yùn)算是將參加運(yùn)算的兩操作對象,按對應(yīng)的二進(jìn)制位分別進(jìn)行“邏輯與”運(yùn)算。運(yùn)算規(guī)則為:只有兩個(gè)相應(yīng)位都為1時(shí),該位的運(yùn)算結(jié)果才為1;兩個(gè)相應(yīng)位的值相異或均為0時(shí),該位的運(yùn)算結(jié)果為0。11.1位運(yùn)算符【例11.
2、1】求表達(dá)式12&10的值。main(){charx=12,y=10;printf(“%d,%d”,x,y);x=x&y;printf(“%d,%d”,x,y);}輸出結(jié)果為:12,108,1011.1位運(yùn)算符按位與運(yùn)算用途:清零:若想將某個(gè)存儲單元清零,只需將這個(gè)存儲單元的值與零進(jìn)行“與”運(yùn)算?!纠?1.2】分析下面程序結(jié)果main(){charch=46;printf("%d",ch);ch=ch&0;printf("%d",ch);}輸出結(jié)果為:46011.1位運(yùn)算符獲取指定位:如果要
3、想獲取某數(shù)據(jù)X的指定位,則可以用一個(gè)數(shù)與X進(jìn)行“與”運(yùn)算,此數(shù)在與指定位相同的位上的值為1,其余各位為0?!纠?1.3】從鍵盤輸入一個(gè)整數(shù),判斷此數(shù)是否能被2整除。#includemain(){intx;printf("Pleaseinputanumber:");scanf("%d",&x);if((x&0x01)==0)/*通過與運(yùn)算,只保留該數(shù)的最低位,然后判斷其是否為0*/printf("%dcanbedividedby2exactly!",x);/*最低位為0,該數(shù)能被2整除*
4、/elseprintf("%dcan’tbedividedby2exactly!",x);/*最低位為1,不能被2整除*/}11.1位運(yùn)算符“按位或”運(yùn)算(
5、)按位或運(yùn)算是將參加運(yùn)算的兩操作對象,按對應(yīng)的二進(jìn)制位分別進(jìn)行“邏輯或”運(yùn)算。運(yùn)算規(guī)則為:只有兩個(gè)相應(yīng)位都為0時(shí),該位的運(yùn)算結(jié)果才為0,其它情況下,結(jié)果全為1?!纠?1.4】求表達(dá)式12
6、10的值。main(){charx=12,y=10;printf(“%d,%d”,x,y);x=x
7、y;printf(“%d,%d”,x,y);}輸出結(jié)果
8、為:12,1014,1011.1位運(yùn)算符用途:按位“或”經(jīng)常用來對一個(gè)數(shù)據(jù)的某些位置1。【例11.5】把整數(shù)x(8位)的低4位置1,高4位不變。main(){charx=67;printf(“%d”,x);x=x
9、15;printf(“%d”,x);}輸出結(jié)果為:677911.1位運(yùn)算符“按位異或”運(yùn)算(^)按位或運(yùn)算是將參加運(yùn)算的兩操作對象,按對應(yīng)的二進(jìn)制位分別進(jìn)行“按位異或”運(yùn)算。運(yùn)算規(guī)則為“按位異或”的應(yīng)用:參加運(yùn)算的兩個(gè)運(yùn)算量,如果兩個(gè)相對應(yīng)位上的值不同,則該位的結(jié)果為1;如果對應(yīng)位上的值相
10、同,則該位的結(jié)果為0?!鞍次划惢颉钡膽?yīng)用使特定位翻轉(zhuǎn),即使指定的位求反。【例11.6】設(shè)x=46,將其高4位保留原樣,低4位各位求反。main(){charx=46;printf(“%d”,x);x=x^15;printf(“%d”,x);}11.1位運(yùn)算符輸出結(jié)果為:4633對變量置零。每一個(gè)數(shù)與它自身進(jìn)行“異或”運(yùn)算,結(jié)果各位均為零。即:x^x=0?!纠?1.7】不用臨時(shí)變量,交換兩個(gè)變量的值。main(){charx=12,y=10;printf(“%d,%d”,x,y);x=x^y;y=
11、y^x;x=x^y;printf(“%d,%d”,x,y);}輸出結(jié)果為:12,1010,1211.1位運(yùn)算符“按位取反”運(yùn)算(~)“按位取反”運(yùn)算符“~”是唯一的一個(gè)單目位運(yùn)算符,用來將一個(gè)二進(jìn)制數(shù)按位取反,即將1變0,將0變1?!纠?1.8】給出一個(gè)數(shù)的原碼,求出該數(shù)的補(bǔ)碼。main(){unsignedinta;/*聲明一個(gè)無符號的整數(shù)a*/unsignedintgetbits(unsigned);/*函數(shù)聲明*/printf("Inputanoctalnumber:");scanf("%o"
12、,&a);/*以八進(jìn)制形式輸入一個(gè)無符號的整數(shù)*/printf("result:%o",getbits(a));/*以八進(jìn)制形式輸出*/}11.1位運(yùn)算符unsignedintgetbits(unsignedvalue)/*求一個(gè)二進(jìn)制數(shù)的補(bǔ)碼*/{unsignedintz;z=value&10000000;if(z==10000000)z=~value+1;/*對負(fù)數(shù)求其補(bǔ)碼*/elsez=value;/*正數(shù)