版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、第九章 位運算,9.1 位運算的概念9.2 位運算9.3 位段簡介,C語言具有匯編語言所能完成的一些功能,這是C語言的重要特色。在計算機用于檢測控制領域中要用到位運算,因此要學習和掌握本章內容。9. 1 位運算的概念 位運算—— 進行二進制位的運算 。C 語言提供的位運算符如下表。,第十二章 位運算,說明: ⑴ 位運算符中除了~ 以外,均為二目(元)運
2、算符,即要求兩側各有一個運算量。⑵ 運算量只能是整型或字符型數(shù)據,不能為實型數(shù)據 。,9.2 位運算,⑵ 用途 : ① 清零:用 0 去“與”某一位,使該位清零。 如想將一個單元清零,即使其全部二進制位為0,只要找一個二進制數(shù),其中各個位符合以下條件:原來數(shù)中為1 的位,新數(shù)中相應位為0,然后使二者進行& 運算 即可。例如:使低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② 保留一個數(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ù)作“與”運算。 例如:有一數(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,,,,,,計算機中的控制字各個位表示某些設備的狀態(tài),狀態(tài)發(fā)生變化,各個位通過位運算改變數(shù)值。,9.2.2 按位或運算符(| )—— 兩個數(shù)的相應位按位或(1) 運算規(guī)則: 相應位只要有一個為1 ,
5、該位相或的結果就為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 按位異或運算符(^)—— 兩個數(shù)的相應位按位異或 異或—— 判斷兩個相應的位值是否為"異","異"則結果為1,否則為0⑴ 運算
7、規(guī)則 : 相應位的位值不同時(相異), 作或 的運算。即 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 去與某些位“異或” ,使 特定位翻轉。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 ③ 交換兩個值 ,不用臨時變量。例如 : a=a ^ b ; b=b ^ a ; a=a ^ b ; 假設a=011,b=100. 請驗證上述式子。,,,b=b ^ (a ^ b)
9、=b ^ a ^ b =a ^ b ^ b=aa=(a ^ b) ^ a =a ^ b ^ a=b ^ a ^ a=b,,對一個二進制數(shù)按位取反 ( 0 → 1 , 1 → 0 )。例如 : ~ 0 0 0 1 1 0 0 1 1 1 1 0 0 1 1 0又如 : 若一個整數(shù) a 為16 位,要使 a 最低一位為 0,可以用a= a &am
10、p; 0177776 ; (常量與 a 的字長有關 )八進制數(shù) 177776 即二進制數(shù) 1111111111111110,適于16位計算機系統(tǒng),對于32位計算機系統(tǒng),常量則應該用037777777776(八進制),這樣改動移植性差。最好是用表達式: a = a & ~1 ; (與 a 的字長無關)其中: ~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ōu)先級別比算術運算符、關系運算符、邏輯運算符和其它位運算符都高。,,將一個二進制數(shù)的各位全部左
12、移若干位,右端空位補0, 高位左移后溢出,舍去不起作用。例如 : a = a << 2 ; (左移二位)若 a=15 , a 二進制數(shù)為 0 0 0 0 1 1 1 1 a 左移2 位為 0 0 1 1 1 1 0 0 其值為 60。左移2 位 相當于 乘以 22 =4,但此結論只適用于左移時被溢出舍棄的高位中不包含1
13、的情況。(見下表),,,左移比乘法運算速度快得多,有些C 編譯程序自動將乘 2 的運算用左移一位來實現(xiàn),將乘 2n 的冪運算處理為左移 n 位。,9.2.5 << (左移運算符),9.2.7 位運算賦值運算 位運算符與賦值運算符可以組合成復合賦值運算符——位運算賦值運算符。如 : &= , |= , ^= , >>= , >= 2 相當于a = a>>2,9.2
14、.6 >> (右移運算符) 將一個二進制數(shù)的各位全部右移若干位,移到右端的低位被舍去。 無符號數(shù), 高位補0。有符號數(shù),正數(shù)(符號位為0)左邊移入0,負數(shù)則取決于所用的計算機系統(tǒng),有“邏輯右移”(移入0)和“算術右移”(正數(shù)移入0, 負數(shù)移入1),稱為符號位擴張。(Turbo C 采用算術右移)例如: a=a >> 2 ; (右移二位 ),若 a=016 a
15、二進制數(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(算術右移)右移一位,相當于除以2, 右移n 位,相當于除以 2n ,運算速度快得多。,對內存中信息的存取一般以字節(jié)為單位。實際上,有時存
16、儲一個信息不必用一個或多個字節(jié),例如,“真”或“假”用0 或1 表示,只需 1 位 即可??梢栽谝粋€字節(jié)中存放幾個信息,實現(xiàn)的方法有:1. 人為地在一個字節(jié)中設幾項,使得這幾項分別占據該字節(jié)中的某幾位。例如,在data 中,設a、b、c、d 分別占 2 位、6 位、4 位、4 位,對其中的某一項 c 賦值 12 時,需要以下操作:⑴ 將字節(jié)中c 項的對應位清零:data=data&0177417(屏蔽字)⑵ 將要輸入的數(shù)
17、 12 左移 4 位,至 與該 c 項的 位數(shù)對應,即使1100 成為右面起第 4~7 位。(1100 << 4 ……→11000000)⑶ 將該字節(jié)中的內容與左移后的數(shù)按位或,實現(xiàn)賦值。這種方法太麻煩!,9. 3 位 段,2. 位段: C 語言允許在一個結構體中以位為單位來指定其成員所占的內存長度,這種以位為單位的成員稱為“位段”或“位域” (bit field)。,利用位段能夠用較少的
18、位數(shù)存儲數(shù)據。例如: struct packed {unsigned a : 2 ;unsigned b : 6 ;unsigned c : 4 ;unsigned d : 4 ;int i ;} data ;,注意:各個位段分配方向(從左到右或從右到左),因機器而異。,也可以使各個位段不恰好占滿一個字節(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 ;注意各個位段的數(shù)值范圍。,關于定義和引用字段的幾點說明 :⑴ 位段成員的類型必須指定為 unsigned int 類型 ;⑵ 若一個字段要從另一個字開始存放,可以用
20、以下形式定義 :struct packed {unsigned a : 1 ;unsigned b : 2 ;unsigned : 0 ;unsigned c : 3 ; (分配在另一個存儲單元)} ; 本來a、b、c 應連續(xù)存放在一個存儲單元(字)中,用了長度為 0 的位段,其作用是使下一個位段從下一個存儲單元開始存放,所以 c 放在另一個存儲單元中
21、。,表示后面位不用,,占一個存儲單元,⑶ 一個位段必須存儲在同一個存儲單元中,不能 跨兩個單元 。 如果第一個單元空間不能容納下 一個位段,則該空間不用,而從下一個單元起存放該位段。,⑷ 可以定義無名字段 ,如:struct {unsigned a : 1 ;unsigned : 2 ; (這二位不用,即空二位)unsigned b : 3 ;unsigned c :
22、 4 ;} ;⑸ 位段的長度不能大于存儲單元的長度,也不能定義位段數(shù)組。⑹ 位段可以用整型形式輸出,如 :printf(" %d , %d , %d " , data.a , data.b , data.c) ;也可以用 % o、 % u、 % x 格式輸出。⑺ 位段可以在數(shù)值表達式中引用,它會被系統(tǒng)自動轉換成整型數(shù)據。如運算data.a + data.b ;是合法的。,例12.1 取一個整數(shù)
23、 a 從低端開始的 4 ~7 位(即第4 位至第7位的4 位)。 分析討論:(1) 使 a 右移4 位(目的是使 a 的第4 位右移到第0位) b= a >> 4(2) 設置一個右端4 位全為1 其余全為 0 的數(shù), 方法是: ~(~0<<4) (見下面所示) ~0:1111….111111 ~0<<4:1111….110000 (左移4位) c= ~
24、( ~0<<4):0000….001111 (按位取反)(3) 將上述兩個數(shù)進行 & 運算,即d=b& c ; 與低 4 位為 1 的數(shù)進行 & 運算, 就能將這 4 位保留下來。,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 位運算舉例,例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這里用二進制表示.,1. 計算下列表達式的值。 (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. 計算下列語句,給出結果。 (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. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
評論
0/150
提交評論