




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、C語言程序設(shè)計(jì)教程(第4版),第11章 位運(yùn)算,李麗娟 2013年2月,本章主要內(nèi)容,1.按位取反運(yùn)算 2.按位左移運(yùn)算 3.按位左移運(yùn)算 4.按位與運(yùn)算 5.按位或運(yùn)算 6.按位異或運(yùn)算 7.復(fù)合位運(yùn)算,第11章 位運(yùn)算, C語言提供的位運(yùn)算符共有6個(gè):,11.1 按位取反運(yùn)算符,按位取反表達(dá)式:m 作用:對m的二進(jìn)制值按位取反,即將1變成0,將0變成1。 例如,若有:int i=85;,i的二進(jìn)制表示為: i=(85)10=(0000 0000 0101 0101)2 對i按位取反: i=(1111 1111 1010 1010) 2 此時(shí),i的最高位為1,代表負(fù)數(shù)。為原數(shù)的補(bǔ)碼形式。 實(shí)
2、際上:i =(1111 1111 1010 1010) 2| 反碼+1 =(1000 0000 0101 0101) 2 +1 =(1000 0000 0101 0110) 2 =-86 (注:負(fù)數(shù)取反時(shí)。符號位不變),11.1 按位取反運(yùn)算符,對于無符號整型數(shù):unsigned int i=85;,i的二進(jìn)制表示為: i=(85)10=(0000 0000 0101 0101)2 對i按位取反: i=(1111 1111 1010 1010) 2 此時(shí),i的最高位為1,仍然代表正數(shù)。 因此,i值就是i按位取反后的值: i=(1111 1111 010101)2 =(65450)10,11.1
3、 按位取反運(yùn)算符,小結(jié): (1) C語言允許對有符號整型數(shù)進(jìn)行位運(yùn)算 缺點(diǎn):不便于掌控程序本身的計(jì)算結(jié)果。 (2) 位運(yùn)算適合于無符號的整型數(shù) 對于需要進(jìn)行位運(yùn)算操作的數(shù)據(jù),通常應(yīng)定義成unsigned型。 (3) 位運(yùn)算符不適合于浮點(diǎn)型數(shù)據(jù)。,11.1 按位取反運(yùn)算符,【例11-1】閱讀下面的程序,了解不同類型的變量進(jìn)行按位取反運(yùn)算的規(guī)則。 /*example11_1.c 了解按位取反運(yùn)算的規(guī)則*/ #include void main() int i1=32767,i2=-32767,i3=10,i4=-10,i; unsigned int u1=65535,u2=0,u3=10,u; p
4、rintf(i1=%d,i1=%dn,i1,i1); printf(i2=%d,i2=%dn,i2,i2); printf(i3=%d,i3=%dn,i3,i3); printf(i4=%d,i4=%dn,i4,i4); printf(u1=%u,u1=%un,u1,u1); printf(u2=%u,u2=%un,u2,u2); printf(u3=%u,u3=%un,u3,u3); ,11.2 按位左移運(yùn)算 ,按位左移表達(dá)式的形式: mn; 作用:將m的二進(jìn)制位全部左移n位,右邊空出的位補(bǔ)零。 高位左移后溢出,舍棄不起作用。,若有: unsigned int m=65; 即:m=(65)1
5、0=(0000 0000 0100 0001)2 則: m2= 00 00 0000 0100 0001 00 丟棄 補(bǔ)入 于是:m2=(0000 0001 0000 0100)2=260,11.2 按位左移運(yùn)算 ,對于有符號的整型數(shù),符號位是保留的。 若有:int n=65 即:n=(65)10=(1000 0000 0100 0001)2 實(shí)際計(jì)算時(shí),是對其補(bǔ)碼進(jìn)行運(yùn)算的: 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 0 65的反碼 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 65的補(bǔ)碼
6、 (n)補(bǔ)1=(1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 0)補(bǔ)碼 保留 補(bǔ)入 因此: n 1=(1111 1111 0111 1110)補(bǔ)碼 =(1000 0000 1000 0010)2 =130,11.2 按位左移運(yùn)算 ,小結(jié): 按位左移1位相當(dāng)于原操作數(shù)乘以2,因此,左移n位,相當(dāng)于操作數(shù)乘以2n。 思考: 若整型數(shù)的字節(jié)長度為2個(gè)字節(jié)(16位),請分析下面的幾種情況: (1) n為有符號整型變量,且n為偶數(shù)時(shí),語句: n15; 會是什么結(jié)果? (2) n為有符號整型變量,且n為奇數(shù)時(shí),語句: n15; 會是什么結(jié)果?,閱讀【例11-2】的程序,了解按位左移運(yùn)算的規(guī)則
7、作用。,11.3 按位右移運(yùn)算 ,按位右移表達(dá)式的形式: mn; 作用:將m的二進(jìn)制位全部右移n位。 左邊空出的位,分兩種情況處理: m為正數(shù),則m右移n位后,左邊補(bǔ)n個(gè)零; n為負(fù)數(shù),則m右移n位后,左邊補(bǔ)n個(gè)符號位。,正數(shù)情況:unsigned int m=65; 即:m=(65)10=(0000 0000 0100 0001)2 則: m2= 00 0000 0000 0100 00 01 補(bǔ)入 丟棄 于是:m2=(0000 0000 0001 0000)2=260,11.3 按位右移運(yùn)算 ,負(fù)數(shù)情況: n=(65)10=(1000 0000 0100 0001)2 在計(jì)算機(jī)中,65的補(bǔ)
8、碼為:1111 1111 1011 1111 (n)補(bǔ)2=11 1111 1111 1011 1111 補(bǔ)入 丟棄 即:n2=(1111 1111 1110 1111)補(bǔ) =(1000 0000 0001 0001)2 =17,11.3 按位右移運(yùn)算 ,小結(jié) 在C語言中,按位右移后左邊補(bǔ)零的情況稱為“邏輯右移”,左邊補(bǔ)1的情況稱為“算術(shù)右移”。 亦即,對于整型變量m: 若m0,則mn為邏輯右移; 若mn為算術(shù)右移。 思考 (1) 請分析邏輯右移和算術(shù)右移的不同之處; (2) 請分析邏輯右移和算術(shù)右移運(yùn)算時(shí)應(yīng)注意些什么。,閱讀【例11-3】的程序,了解按位左移運(yùn)算的規(guī)則和作用。,11.4 “按位
9、與” 運(yùn)算符 即: a=(73)10=(0000 0000 0100 1001)2 b=(21)10=(0000 0000 0001 0101)2。 0000 0000 0100 1001 a的二進(jìn)制值 對負(fù)數(shù)需要用其補(bǔ)碼來計(jì)算 b|原碼=(21)10=(1000 0000 0001 0101) b|補(bǔ)碼=1111 1111 1110 1011 于是: 0000 0000 0100 1001 a的二進(jìn)制值 即: a=(73)10=(0000 0000 0100 1001)2 b=(21)10=(0000 0000 0001 0101)2。 0000 0000 0100 1001 a的二進(jìn)制值
10、| 0000 0000 0001 0101 b的二進(jìn)制值 0000 0000 0101 1101 a|b 結(jié)果:a 對負(fù)數(shù)需要用其補(bǔ)碼來計(jì)算 b|原碼=(21)10=(1000 0000 0001 0101) b|補(bǔ)碼=1111 1111 1110 1011 于是: 0000 0000 0100 1001 a的二進(jìn)制值 | 1111 1111 1110 1011 b的補(bǔ)碼 1111 1111 1110 1011 a|b的補(bǔ)碼 結(jié)果:a|b=(1000 0000 0001 0101)2=21。 注意:a|b的補(bǔ)碼并不是最后的結(jié)果。,11.5 “按位或”運(yùn)算符 |,小結(jié) (1)與0進(jìn)行“按位或”運(yùn)
11、算的結(jié)果將保持自身的值不變;與l進(jìn)行“按位或”運(yùn)算的結(jié)果將變成1。 (2)實(shí)際應(yīng)用時(shí),可用來提取變量某些字節(jié)的值或?qū)⒆兞磕承┳止?jié)的值變?yōu)?。例如: a的二進(jìn)制值為:x x x x x x x x x x x x x x x x (x表示即可為0也可為1) b的二進(jìn)制值為:0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 a|b的二進(jìn)制值: x x x x x x x x 1 1 1 1 1 1 1 1 思考 請編寫程序,從鍵盤輸入一個(gè)無符號的整型數(shù)x,將x從低位數(shù)起的奇數(shù)位全部換成1(如果原來該位值為1,則仍為1不變),偶數(shù)位保持不變。,參考【例11-5】的程序,了解按位或運(yùn)算的
12、規(guī)則和作用。,11.6 “按位異或”運(yùn)算符,運(yùn)算規(guī)則: 若a、b對應(yīng)位的值相同,則該位的結(jié)果為0,否則為1。 即:00=0 01=1 10=1 11=0,按位異或表達(dá)式的一般形式:ab 作用:將變量a、b的二進(jìn)制值按位進(jìn)行異或運(yùn)算。,若有:unsigned int a=73,b=21; 即: a=(73)10=(0000 0000 0100 1001)2 b=(21)10=(0000 0000 0001 0101)2。 0000 0000 0100 1001 a的二進(jìn)制值 0000 0000 0001 0101 b的二進(jìn)制值 0000 0000 0101 1100 ab 結(jié)果:a 對負(fù)數(shù)需要用
13、其補(bǔ)碼來計(jì)算 b|原碼=(21)10=(1000 0000 0001 0101) b|補(bǔ)碼=1111 1111 1110 1011 于是: 0000 0000 0100 1001 a的二進(jìn)制值 1111 1111 1110 1011 b的補(bǔ)碼 1111 1111 1010 0010 ab的補(bǔ)碼 結(jié)果:ab=(1000 0000 0101 1110)2=94。 注意:ab的補(bǔ)碼并不是最后的結(jié)果。,11.6 “按位異或”運(yùn)算符 ,小結(jié) (1) 任何二進(jìn)制值與0相“異或”時(shí),其值保持不變,與1相“異或”時(shí),其值取反。 (2) 實(shí)際應(yīng)用時(shí),可實(shí)現(xiàn)對指定位的二進(jìn)制值取反或?qū)χ付ㄎ坏亩M(jìn)制值保持不變。 思
14、考 (1) 怎樣通過異或運(yùn)算實(shí)現(xiàn)交換兩個(gè)變量的值? (2) 編寫程序,將兩個(gè)無符號的整數(shù)x和y從低位數(shù)開始的奇數(shù)位上的值取反,偶數(shù)位上的值保持不變,改變后再交換兩變量的值。,參考【例11-6】的程序,了解按位異或運(yùn)算的規(guī)則和作用。,11.7 復(fù)合位運(yùn)算符,位運(yùn)算符和賦值運(yùn)算符一起可以組成復(fù)合位運(yùn)算賦值運(yùn)算符。,11.8 程序范例,思考1: 編寫程序,取一整型數(shù) a的二進(jìn)制從右端開始的 4 7 位。,提示:, 先使 a 右移 4 位。即: a(7 4 + 1 ) a4, 設(shè)置一個(gè)低4位全為1,其余全為0 的數(shù)b。即: ( 0 4 ), 將兩者進(jìn)行 scanf(“%ud”, ,思考2:編寫程序,循
15、環(huán)將a的右端 n 位放到a的左端n位中。,將a的右端 n 位移到最左端n位,保留。 b = a ( 16 n ), 將a右移n位,其左端高位補(bǔ)n個(gè)0,保留 c = a n ;, 將c與b進(jìn)行按位或運(yùn)算。 c = c | b,提示:,程序如下: #include main( ) unsigned a,b,c; int n; scanf(“a=%ud,n=%d”, ,11.8 程序范例,【例11-7】在互聯(lián)網(wǎng)絡(luò)中,計(jì)算機(jī)都是通過IP地址進(jìn)行通信的,計(jì)算機(jī)中的每一個(gè)IP地址都用一個(gè)32位的unsigned long型變量保存,它分別記錄了這臺計(jì)算機(jī)的網(wǎng)絡(luò)ID和主機(jī)ID。請編寫程序,從一個(gè)正確的IP地址中分離出它的網(wǎng)絡(luò)ID和主機(jī)ID。,分析:一個(gè)32位的IP地址可以分解成4個(gè)字節(jié),每一個(gè)字節(jié)代表了IP地址的段,如202.103.96.68就代表了一個(gè)合法的IP地址。 若用ip表示某計(jì)算機(jī)的IP地
溫馨提示
- 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 7.2萬有引力定律+課件+高一下學(xué)期物理人教版(2019)必修第二冊
- 郵件系統(tǒng)性能評估
- 優(yōu)化施工方案提升硫化床鍋爐施工效率
- 企業(yè)在線內(nèi)訓(xùn)課件
- 財(cái)務(wù)培訓(xùn)與財(cái)務(wù)管理能力提升合同
- 綠色建筑材料采購合同擔(dān)保公司環(huán)保協(xié)議
- 經(jīng)理股權(quán)分紅方案
- 金融產(chǎn)品設(shè)計(jì)與財(cái)務(wù)風(fēng)險(xiǎn)評估合同
- 食品生產(chǎn)售后保障方案
- 社區(qū)樓宇封控方案
- 肝硬化門靜脈高壓食管胃靜脈曲張出血的防治指南( 2022)
- 子宮脫垂病例護(hù)理討論
- vte病人的健康宣教
- 公路車行業(yè)分析
- 鐵路集裝箱現(xiàn)狀分析報(bào)告
- 2024年高等教育文學(xué)類自考-00730中外音樂史歷年高頻考點(diǎn)試卷專家薈萃含答案
- 財(cái)政內(nèi)部監(jiān)督制度范本
- 2023全新包干制物業(yè)服務(wù)合同
- 外賣運(yùn)營培訓(xùn)手冊
- 多學(xué)科治療協(xié)作模式
- 青島離婚協(xié)議書
評論
0/150
提交評論