版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第九章 位運(yùn)算,9.1 位運(yùn)算的概念9.2 位運(yùn)算9.3 位段簡(jiǎn)介,C語(yǔ)言具有匯編語(yǔ)言所能完成的一些功能,這是C語(yǔ)言的重要特色。在計(jì)算機(jī)用于檢測(cè)控制領(lǐng)域中要用到位運(yùn)算,因此要學(xué)習(xí)和掌握本章內(nèi)容。9. 1 位運(yùn)算的概念 位運(yùn)算—— 進(jìn)行二進(jìn)制位的運(yùn)算 。C 語(yǔ)言提供的位運(yùn)算符如下表。,第十二章 位運(yùn)算,說(shuō)明: ⑴ 位運(yùn)算符中除了~ 以外,均為二目(元)運(yùn)
2、算符,即要求兩側(cè)各有一個(gè)運(yùn)算量。⑵ 運(yùn)算量只能是整型或字符型數(shù)據(jù),不能為實(shí)型數(shù)據(jù) 。,9.2 位運(yùn)算,⑵ 用途 : ① 清零:用 0 去“與”某一位,使該位清零。 如想將一個(gè)單元清零,即使其全部二進(jìn)制位為0,只要找一個(gè)二進(jìn)制數(shù),其中各個(gè)位符合以下條件:原來(lái)數(shù)中為1 的位,新數(shù)中相應(yīng)位為0,然后使二者進(jìn)行& 運(yùn)算 即可。例如:使低4 位為01 1 0 1 1 0 0 1 & 1 1
3、1 1 0 0 0 01 1 0 1 0 0 0 0 低4位為0② 保留一個(gè)數(shù)中的某些位。用 1 去“與”某一位,保留該位。如:保留低4位1 0 1 0 1 1 0 0 & 0 0 0 0 1 1 1 10 0 0 0 1 1 0 0 保留低4位 ③ 保留其中某些位,將它與這些位為1
4、的數(shù)作“與”運(yùn)算。 例如:有一數(shù)01010100,想保留其左起的第 3、4、5、7、8 位,0 1 0 1 0 1 0 0 &0 0 1 1 1 0 1 10 0 0 1 0 0 0 0,,,,,,計(jì)算機(jī)中的控制字各個(gè)位表示某些設(shè)備的狀態(tài),狀態(tài)發(fā)生變化,各個(gè)位通過(guò)位運(yùn)算改變數(shù)值。,9.2.2 按位或運(yùn)算符(| )—— 兩個(gè)數(shù)的相應(yīng)位按位或(1) 運(yùn)算規(guī)則: 相應(yīng)位只要有一個(gè)為1 ,
5、該位相或的結(jié)果就為1,否則為0 , 即 0 | 0 = 0 1 | 0 = 1 0 | 1 = 1 1 | 1 = 1例如:1 1 0 1 1 0 0 1 |0 0 0 0 1 1 1 11 1 0 1 1 1 1 1(2) 用途:①用 1去與某些位“或”,使某些位為 1。例如:1 1
6、 0 1 1 0 0 1 |0 0 0 0 1 1 1 11 1 0 1 1 1 1 1 低 4 位為 1② 用 0去與某些位“或”,保留原位。例如:上例中 前4 位保留原位,,,,9.2.3 按位異或運(yùn)算符(^)—— 兩個(gè)數(shù)的相應(yīng)位按位異或 異或—— 判斷兩個(gè)相應(yīng)的位值是否為"異","異"則結(jié)果為1,否則為0⑴ 運(yùn)算
7、規(guī)則 : 相應(yīng)位的位值不同時(shí)(相異), 作或 的運(yùn)算。即 0 ^ 0 = 0 1 ^ 0 = 1 0 ^ 1 = 1 1 ^ 1 = 0 例如:1 1 0 1 1 0 0 1 ^0 0 0 0 1 1 1 11 1 0 1 0 1 1 0 ⑵ 用途 :① 用 1 去與某些位“異或” ,使 特定位翻轉(zhuǎn)。0 1
8、 1 1 1 0 1 0 ^0 0 0 0 1 1 1 10 1 1 1 0 1 0 1 ② 用 0 去與某些位異或 , 保留原值。如上例中前 4 位用 0去異或,保留原值 0111 ③ 交換兩個(gè)值 ,不用臨時(shí)變量。例如 : a=a ^ b ; b=b ^ a ; a=a ^ b ; 假設(shè)a=011,b=100. 請(qǐng)驗(yàn)證上述式子。,,,b=b ^ (a ^ b)
9、=b ^ a ^ b =a ^ b ^ b=aa=(a ^ b) ^ a =a ^ b ^ a=b ^ a ^ a=b,,對(duì)一個(gè)二進(jìn)制數(shù)按位取反 ( 0 → 1 , 1 → 0 )。例如 : ~ 0 0 0 1 1 0 0 1 1 1 1 0 0 1 1 0又如 : 若一個(gè)整數(shù) a 為16 位,要使 a 最低一位為 0,可以用a= a &am
10、p; 0177776 ; (常量與 a 的字長(zhǎng)有關(guān) )八進(jìn)制數(shù) 177776 即二進(jìn)制數(shù) 1111111111111110,適于16位計(jì)算機(jī)系統(tǒng),對(duì)于32位計(jì)算機(jī)系統(tǒng),常量則應(yīng)該用037777777776(八進(jìn)制),這樣改動(dòng)移植性差。最好是用表達(dá)式: a = a & ~1 ; (與 a 的字長(zhǎng)無(wú)關(guān))其中: ~1 = ~(0000000000000001)=1111111111111110或a = a
11、& (a -1) ;若 a = 0 0 0 1 1 0 1 1 & a - 1 = 0 0 0 1 1 0 1 0 0 0 0 1 1 0 1 0,,9.2.4 按位“取反”運(yùn)算符(~ ),~ 運(yùn)算符的優(yōu)先級(jí)別比算術(shù)運(yùn)算符、關(guān)系運(yùn)算符、邏輯運(yùn)算符和其它位運(yùn)算符都高。,,將一個(gè)二進(jìn)制數(shù)的各位全部左
12、移若干位,右端空位補(bǔ)0, 高位左移后溢出,舍去不起作用。例如 : a = a << 2 ; (左移二位)若 a=15 , a 二進(jìn)制數(shù)為 0 0 0 0 1 1 1 1 a 左移2 位為 0 0 1 1 1 1 0 0 其值為 60。左移2 位 相當(dāng)于 乘以 22 =4,但此結(jié)論只適用于左移時(shí)被溢出舍棄的高位中不包含1
13、的情況。(見下表),,,左移比乘法運(yùn)算速度快得多,有些C 編譯程序自動(dòng)將乘 2 的運(yùn)算用左移一位來(lái)實(shí)現(xiàn),將乘 2n 的冪運(yùn)算處理為左移 n 位。,9.2.5 << (左移運(yùn)算符),9.2.7 位運(yùn)算賦值運(yùn)算 位運(yùn)算符與賦值運(yùn)算符可以組合成復(fù)合賦值運(yùn)算符——位運(yùn)算賦值運(yùn)算符。如 : &= , |= , ^= , >>= , >= 2 相當(dāng)于a = a>>2,9.2
14、.6 >> (右移運(yùn)算符) 將一個(gè)二進(jìn)制數(shù)的各位全部右移若干位,移到右端的低位被舍去。 無(wú)符號(hào)數(shù), 高位補(bǔ)0。有符號(hào)數(shù),正數(shù)(符號(hào)位為0)左邊移入0,負(fù)數(shù)則取決于所用的計(jì)算機(jī)系統(tǒng),有“邏輯右移”(移入0)和“算術(shù)右移”(正數(shù)移入0, 負(fù)數(shù)移入1),稱為符號(hào)位擴(kuò)張。(Turbo C 采用算術(shù)右移)例如: a=a >> 2 ; (右移二位 ),若 a=016 a
15、二進(jìn)制數(shù)為 0 0 0 0 1 1 1 0,a 右移二位為 0 0 0 0 0 0 1 1 a:1001011111101101a>>1:0100101111110110(邏輯右移)a>>1:1100101111110110(算術(shù)右移)右移一位,相當(dāng)于除以2, 右移n 位,相當(dāng)于除以 2n ,運(yùn)算速度快得多。,對(duì)內(nèi)存中信息的存取一般以字節(jié)為單位。實(shí)際上,有時(shí)存
16、儲(chǔ)一個(gè)信息不必用一個(gè)或多個(gè)字節(jié),例如,“真”或“假”用0 或1 表示,只需 1 位 即可。可以在一個(gè)字節(jié)中存放幾個(gè)信息,實(shí)現(xiàn)的方法有:1. 人為地在一個(gè)字節(jié)中設(shè)幾項(xiàng),使得這幾項(xiàng)分別占據(jù)該字節(jié)中的某幾位。例如,在data 中,設(shè)a、b、c、d 分別占 2 位、6 位、4 位、4 位,對(duì)其中的某一項(xiàng) c 賦值 12 時(shí),需要以下操作:⑴ 將字節(jié)中c 項(xiàng)的對(duì)應(yīng)位清零:data=data&0177417(屏蔽字)⑵ 將要輸入的數(shù)
17、 12 左移 4 位,至 與該 c 項(xiàng)的 位數(shù)對(duì)應(yīng),即使1100 成為右面起第 4~7 位。(1100 << 4 ……→11000000)⑶ 將該字節(jié)中的內(nèi)容與左移后的數(shù)按位或,實(shí)現(xiàn)賦值。這種方法太麻煩!,9. 3 位 段,2. 位段: C 語(yǔ)言允許在一個(gè)結(jié)構(gòu)體中以位為單位來(lái)指定其成員所占的內(nèi)存長(zhǎng)度,這種以位為單位的成員稱為“位段”或“位域” (bit field)。,利用位段能夠用較少的
18、位數(shù)存儲(chǔ)數(shù)據(jù)。例如: struct packed {unsigned a : 2 ;unsigned b : 6 ;unsigned c : 4 ;unsigned d : 4 ;int i ;} data ;,注意:各個(gè)位段分配方向(從左到右或從右到左),因機(jī)器而異。,也可以使各個(gè)位段不恰好占滿一個(gè)字節(jié),例如:struct packed {unsigned a : 2 ;un
19、signed b : 3 ;unsigned c : 4 ;int i;} ;struct packed data ;,位段中成員引用的方法 :data . a=2 ;data . b=7 ;data . c=9 ;注意各個(gè)位段的數(shù)值范圍。,關(guān)于定義和引用字段的幾點(diǎn)說(shuō)明 :⑴ 位段成員的類型必須指定為 unsigned int 類型 ;⑵ 若一個(gè)字段要從另一個(gè)字開始存放,可以用
20、以下形式定義 :struct packed {unsigned a : 1 ;unsigned b : 2 ;unsigned : 0 ;unsigned c : 3 ; (分配在另一個(gè)存儲(chǔ)單元)} ; 本來(lái)a、b、c 應(yīng)連續(xù)存放在一個(gè)存儲(chǔ)單元(字)中,用了長(zhǎng)度為 0 的位段,其作用是使下一個(gè)位段從下一個(gè)存儲(chǔ)單元開始存放,所以 c 放在另一個(gè)存儲(chǔ)單元中
21、。,表示后面位不用,,占一個(gè)存儲(chǔ)單元,⑶ 一個(gè)位段必須存儲(chǔ)在同一個(gè)存儲(chǔ)單元中,不能 跨兩個(gè)單元 。 如果第一個(gè)單元空間不能容納下 一個(gè)位段,則該空間不用,而從下一個(gè)單元起存放該位段。,⑷ 可以定義無(wú)名字段 ,如:struct {unsigned a : 1 ;unsigned : 2 ; (這二位不用,即空二位)unsigned b : 3 ;unsigned c :
22、 4 ;} ;⑸ 位段的長(zhǎng)度不能大于存儲(chǔ)單元的長(zhǎng)度,也不能定義位段數(shù)組。⑹ 位段可以用整型形式輸出,如 :printf(" %d , %d , %d " , data.a , data.b , data.c) ;也可以用 % o、 % u、 % x 格式輸出。⑺ 位段可以在數(shù)值表達(dá)式中引用,它會(huì)被系統(tǒng)自動(dòng)轉(zhuǎn)換成整型數(shù)據(jù)。如運(yùn)算data.a + data.b ;是合法的。,例12.1 取一個(gè)整數(shù)
23、 a 從低端開始的 4 ~7 位(即第4 位至第7位的4 位)。 分析討論:(1) 使 a 右移4 位(目的是使 a 的第4 位右移到第0位) b= a >> 4(2) 設(shè)置一個(gè)右端4 位全為1 其余全為 0 的數(shù), 方法是: ~(~0<<4) (見下面所示) ~0:1111….111111 ~0<<4:1111….110000 (左移4位) c= ~
24、( ~0<<4):0000….001111 (按位取反)(3) 將上述兩個(gè)數(shù)進(jìn)行 & 運(yùn)算,即d=b& c ; 與低 4 位為 1 的數(shù)進(jìn)行 & 運(yùn)算, 就能將這 4 位保留下來(lái)。,main( ){ unsigned a, b , c , d; scanf("% o",&a) ; b= a>>4 ; c= ~ (~ 0
25、<<4) ; d= b& c ; printf("%o,%d\n", a , a) ; printf("%o,%d\n", d , d) ;},12.2 位運(yùn)算舉例,例12.2 整數(shù) a 循環(huán)右移 n 位 (1) 將 a 右端 n 位先放到 b中的左端 n 位b=a>n (3) 將 c與 b按位或
26、 c | b,main( ){ unsigned a, b, c ; int n ; scanf("%u,%d",&a , &n) ; b = a > n ; c = c | b ; printf("%u >> %d = %u\n", a , n , c);},若 a = 1101010111111011
27、 n = 3 c = 0111101010111111這里用二進(jìn)制表示.,1. 計(jì)算下列表達(dá)式的值。 (1) 5 & 3 , 7 & 4 , 5 | 3 , 7 | 4 (2) 5 && 3 , 7 && 4 , 5 | | 3 , 7 | | 4 , (3) ( - 12) & 6 ,
28、 13 ^ 9 , ~15 , 9>3 ,2. 計(jì)算下列語(yǔ)句,給出結(jié)果。 (1) a = - 4 ; b = a | 6 ; (2) a = 3 ; b = a > 2 ; (4) a = 3 ; b = 4 ; k =2 ; a | b | k ; a & b & k ;
溫馨提示
- 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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫(kù)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 第13章 位運(yùn)算
- 第12章 位運(yùn)算
- 基礎(chǔ)護(hù)理學(xué)第09章-病人臥位與安全的護(hù)理
- 第09章 基礎(chǔ)處理.doc
- 第09章 消費(fèi)稅
- 第09章 基礎(chǔ)處理.doc
- 第1章《整式的運(yùn)算》好題集(09)1.3同底數(shù)冪的乘法
- 第09章稅收原理習(xí)題
- 第3章 數(shù)據(jù)與數(shù)據(jù)運(yùn)算
- 生理學(xué) 第09章 自測(cè)
- 09 第9章 創(chuàng)建型模式
- matlab運(yùn)算基礎(chǔ)(第2章)答案
- 第4章集成運(yùn)算放大電路
- 第09章病理練習(xí)題
- 制藥工程學(xué)第09章
- 國(guó)際貿(mào)易實(shí)務(wù)第09章
- 第09章手動(dòng)變速器1
- 營(yíng)銷第09章企業(yè)形象策劃
- 第09章 化學(xué)治療藥 自測(cè)練習(xí)
- 第09章 晶體結(jié)構(gòu) 習(xí)題解答
評(píng)論
0/150
提交評(píng)論