C語言程序設計_12章 位運算1_第1頁
C語言程序設計_12章 位運算1_第2頁
C語言程序設計_12章 位運算1_第3頁
C語言程序設計_12章 位運算1_第4頁
C語言程序設計_12章 位運算1_第5頁
已閱讀5頁,還剩18頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、1 C C語言允許對內存中的語言允許對內存中的字節(jié)字節(jié)或字節(jié)內的或字節(jié)內的二進制位二進制位進行運算進行運算, ,即位運算即位運算. .12.1 12.1 位運算符和位運算位運算符和位運算 位運算符共位運算符共6 6 種種: : & | & | 說明說明: : 1. 1. 位運算符中除了位運算符中除了 是單目運算符外是單目運算符外, ,其余均為二目運算其余均為二目運算符符, ,即要求運算符兩側各有一個運算對象即要求運算符兩側各有一個運算對象. . 2. 2. 運算對象只允許是運算對象只允許是整型或字符型數據整型或字符型數據. .包括包括: : char, short, int,

2、long, unsigned . char, short, int, long, unsigned . 第十二章 位運算212.1.1 12.1.1 “按位相與按位相與” ” 運算符運算符 ( (& &) ) 作用作用: : 對參加運算的兩個二進制數對參加運算的兩個二進制數按位進行邏輯與按位進行邏輯與運算運算. . 規(guī)則規(guī)則: : 0&0 = 0 , 1&0 = 0 , 0&1 = 0 , 1&1 = 1 0&0 = 0 , 1&0 = 0 , 0&1 = 0 , 1&1 = 1 例如例如: a = 1, b =

3、: a = 1, b = 2, 2, 則則: a & b = 0 : a & b = 0 000000010000000011111110111111110000000000000000aba&b用途:用途:“與與”0 0可以可以屏蔽屏蔽掉某些位,掉某些位,“與與”1 1可以可以篩選篩選出某些位。出某些位。典型的用法有:典型的用法有:清零。欲對一個字節(jié)清零,通常是清零。欲對一個字節(jié)清零,通常是“與與”上上0 x00 0 x00 。1)1) 取出一個數中的某些指定位。比如有一個整數取出一個數中的某些指定位。比如有一個整數a a ,欲取出,欲取出它的低它的低8 8 位,應:

4、位,應: 000010010000110011111111000000000000100100000000a0 x00ffc312.1.212.1.2 “ “按位相或按位相或”運算符運算符( (| |) ) 作用作用: : 對參加運算的兩個二進制數對參加運算的兩個二進制數逐位逐位進行進行邏輯或邏輯或運算運算. . 規(guī)則規(guī)則: : 0|0 = 0 , 1|0 = 1 , 0|1 = 1 , 1|1 = 10|0 = 0 , 1|0 = 1 , 0|1 = 1 , 1|1 = 1 例如例如: a = 1, b = : a = 1, b = 1, 1, 則則: a|b = : a|b = 1 .1

5、.000000010000000100000000000000001111111111111111111111111111111111111111111111111111111111111111a ab ba|ba|b用途:用途:“或或”1 1可以可以屏蔽屏蔽掉某些位,掉某些位,“或或”0 0可以可以篩選篩選出某些位。出某些位。典型的用法主要是:典型的用法主要是:置置 1 1。欲對某些位置。欲對某些位置1 1,只需在相應位上,只需在相應位上“或或”1 1便可便可 。4例如例如: a = 15 , b = 0 , : a = 15 , b = 0 , 則則: a b = 15.: a b = 1

6、5.000011110000000000000000000000000000111100000000aba b例例: : main ( ) int a = 3 , b = 4 ; a = a b ; b = b a ; a = a b ; printf ( “ %d , %d ” ,a , b ) ; 輸出輸出: 4 , 3: 4 , 3000000110000000000000100000000000000011100000000aba0000001100000000b0000010000000000a12.1.3 12.1.3 “按位異或按位異或”運算符運算符( ( ) ) 作用作用: :

7、 對參加運算的兩個二進制數對參加運算的兩個二進制數按位按位進行進行邏輯異或邏輯異或運算運算. . 規(guī)則規(guī)則: : 00 = 0, 10 = 1, 01 = 1, 11 = 000 = 0, 10 = 1, 01 = 1, 11 = 0結論結論: : 利用異或運算利用異或運算, ,不必設置第三個變量就可以實現兩個不必設置第三個變量就可以實現兩個整型變量值的交換。整型變量值的交換。5用途用途: :某位某位“異或異或”1 1 要變,某位要變,某位“異或異或”0 0 不變。不變。1) 1) 使指定位使指定位翻轉翻轉。比如:要使一個字節(jié)的低四位翻轉,只需異。比如:要使一個字節(jié)的低四位翻轉,只需異或或0

8、x0f 0 x0f 。00100011a00001111a0 x0f001011002) 2) 清零。一個整型清零。一個整型( (含字符型含字符型) )數據數據“異或異或”自身自身, ,便清零便清零. .00100011aa0000000000100011a612.1.412.1.4 “ “按位取反按位取反” ” 運算符運算符( () )作用作用: : 對一個二進制數對一個二進制數按位取反按位取反, ,是一個單目運算符是一個單目運算符. .如如: a = 15 : a = 15 則則 a = 65520a = 65520 00000000 000011111111111111110000a a

9、注意注意: : 和和! ! 運算符是兩個完全不同的運算符。運算符是兩個完全不同的運算符。 的優(yōu)先級與的優(yōu)先級與 + +, + +, , !, !相同,且結合性都是相同,且結合性都是從右至左從右至左。例如:例如:main ( ) int a = 0 , b = 1 ; printf ( “ %d , %d n”, a ,b ) ; printf ( “ %d , %d n”, !a , !b ) ; 運行結果運行結果: : 1, 2 1, 0 000000000000000011111111111111110 07應用舉例應用舉例: : 若有一個整數若有一個整數a a ,想使它最低一位為,想使它

10、最低一位為0 0(即屏蔽(即屏蔽d0d0位),而其它位不變。請問如何操作?位),而其它位不變。請問如何操作?方法是方法是: : a=a & a=a & 1;1; 請問可用請問可用 a=a & 0 xfffe; a=a & 0 xfffe; 嗎?嗎? 答:對于以答:對于以1616位存放一個整型數據的計算機系統,后者也是位存放一個整型數據的計算機系統,后者也是可以的。但對于以可以的。但對于以3232位(或更多位)存放一個整型數據的系位(或更多位)存放一個整型數據的系統統( (如如VAX 11/780)VAX 11/780),后者是不可以的。因此,后者的,后者是不可以

11、的。因此,后者的可移植可移植性性很差;而前者則適合于任何系統,程序的可移植性好!很差;而前者則適合于任何系統,程序的可移植性好!00001011000000001111111011111111a0 xfffe0000101100000000111111101111111100000010000000000000000000000000a0 xfffe111111101111111111111111111111111 11616位整型位整型3232位整型位整型812.1.5 12.1.5 左移位運算左移位運算 ( () ) 作用作用: : 將操作數的各個二進位順序將操作數的各個二進位順序左移左移

12、, ,右端空出的位右端空出的位補補0 0, ,而移而移出左端之外的位則丟失出左端之外的位則丟失. . 如如: an : an 表示將表示將a a 的各個二進位順序左移的各個二進位順序左移n n 位位(n (n 為正整數為正整數) ). . 例如例如: a=25; : a=25; 則則 a3 a3 的結果為的結果為2002000001100100011001000000000000000011001110010000000000000000000000a aa3a3 說明說明: : (1)(1) 對于對于無符號數無符號數, ,左移左移1 1位位, ,相當于乘相當于乘2 2 ;左移;左移n n 位

13、位, ,則乘則乘2 2n n。但是此結論只適用于該數左移時被溢出的最高位中沒有但是此結論只適用于該數左移時被溢出的最高位中沒有1 1的情況。的情況。 (2) (2) 對于用補碼表示的正數對于用補碼表示的正數, ,如果左移出的全部是如果左移出的全部是0 0 , , 且移出且移出后的最高位仍為后的最高位仍為0 0 時,數據不會溢出。時,數據不會溢出。9(3)(3) 對于用補碼表示的負數對于用補碼表示的負數, ,如果左移出的全部是如果左移出的全部是1 1, ,且移出后的且移出后的最高位仍為最高位仍為1 1 時,數據不會溢出。如時,數據不會溢出。如: :111111101111111011111111

14、1111111111110111100000001111111111111111 2 2 2323 (4) (4) 若非上面若非上面(2)(2)、(3)(3)所述情況,則數據左移后會產生溢出所述情況,則數據左移后會產生溢出, ,那那 就不能簡單地用乘就不能簡單地用乘2 2 來計算了。來計算了。 如如: : 有符號字符型數據有符號字符型數據64 64 , , 當它左移當它左移2 2 位時位時, ,結果為結果為0 0 . .00000010000100000 000000000000000按位取反加按位取反加1 1 得:得: 161601000000010000006464000000000000

15、000064642) ) 作用作用: : 將操作數的各個二進位順序將操作數的各個二進位順序右移右移. .左端空出的位左端空出的位補補0 0 或或補補1 1, ,而移出右端的位則被舍去而移出右端的位則被舍去. . 如如: an : an 表示將表示將a a 的各個二進位順序右移的各個二進位順序右移n n 位位. . 說明說明: : 右移運算的結果與操作數的符號有關右移運算的結果與操作數的符號有關. . 就就Turbo C2.0Turbo C2.0而言:而言: 1) 1) 無符號數為無符號數為“邏輯右移邏輯右移”,即左端空出位一律補,即左端空出位一律補0 0 . . 2) 2) 有符號數為有符號數

16、為“算術右移算術右移”,即正數右移,即正數右移, ,空位補空位補0 0 , ,負數右移負數右移, ,空位補空位補1 1 . .一句話,算術右移是指最高位移入符號位。一句話,算術右移是指最高位移入符號位。 其它系統對有符號數可能依然采用其它系統對有符號數可能依然采用“邏輯右移邏輯右移”, ,這隨系統而定這隨系統而定. .0000000000000000100000001000000000000000000000000 01000000100000000000000000000001 110000001000000a aa 1a 1a 1a 1邏輯右移邏輯右移, ,結果為結果為 163841638

17、4算術右移算術右移, ,結果為結果為 1638416384 算術右移運算算術右移運算相當于相當于除除2 2 運算運算。 右移右移 1 1 位,相當于除以位,相當于除以2 2 。右移右移n n 位,則除以位,則除以2 2n n 。例如例如: a = : a = 32768327681112.1.7 12.1.7 位運算符的優(yōu)先級與結合性位運算符的優(yōu)先級與結合性 & | 2 5 8 9 10高高低低結合性結合性: : 運算是從右至左運算是從右至左, , 其余均按從左至右。其余均按從左至右。12.1.8 12.1.8 由位運算構成的復合賦值運算符由位運算構成的復合賦值運算符 & =

18、, | = , = , = 如如: : a & = b 等價于等價于 a = a & b a = m + 1 等價于等價于 a=am+1 等價于等價于 a=a 2 & y 2 )& (y 4 (2) 設置一個低設置一個低4 4位全為位全為1,1,其余位全為其余位全為0 0的數的數. . ( 0 4 & ( 0 4 ; c = ( 0 4 ) ; d = b & c ; printf ( “ %on %on ” , a , d ) ; 111100001111111100000000 0000111112.2 12.2 位運算舉例(自學)位運算舉例

19、(自學)c1111111111111111 0 m; c = ( 0 n ); d = b & c ; 00000000 1101100100000000 00001101ad 1 0 0 0 1 0 0 1右移右移 2 位位 0 1 1 0 0 0 1 0例例12.2 將一個整數將一個整數a 循環(huán)右移循環(huán)右移n 位。所謂循環(huán)右移是將位。所謂循環(huán)右移是將a 最右最右端的位順序移到端的位順序移到a 的最左端,而將的最左端,而將a 中原左端的各位順序右移。中原左端的各位順序右移。14 分析:分析: (1) 將將a 左移左移16n 位并存入變量位并存入變量b 中中(即用即用b存放未來的高位存

20、放未來的高位)。 b = a n 0001101111110101c0111101111110101c15main ( ) unsignde a , b , c ; int n ; scanf ( “ %o , %d ” , &a , &n ) ; b = a n ; c = c | b ; printf ( “ %o n %o n” , a , c ) ;如輸入如輸入: 157653 , 3 輸出為輸出為: 157653 75765同樣的方法,可以實現同樣的方法,可以實現循環(huán)左移循環(huán)左移。11011111101010110111101111110101ac1612.3 12.

21、3 位位 段段 以前,我們內存的存取都是以以前,我們內存的存取都是以字節(jié)字節(jié)為單位,即信息存儲至為單位,即信息存儲至少要占用一個字節(jié)。實際上,有時存儲一個信息不必占用一個少要占用一個字節(jié)。實際上,有時存儲一個信息不必占用一個或多個字節(jié),而只需占用或多個字節(jié),而只需占用1 1位位或幾位便可。這在計算機過程控或幾位便可。這在計算機過程控制和數據通信領域經常會遇到。制和數據通信領域經常會遇到。C C語言提供對這方面的處理,語言提供對這方面的處理,而且可用以下兩種方法實現:而且可用以下兩種方法實現:1 1、通過位運算實現、通過位運算實現對對1 1位或幾位的操作:比如我們可以人為位或幾位的操作:比如我們

22、可以人為地將一個字節(jié)地將一個字節(jié)datadata劃分為幾項,假如是四項劃分為幾項,假如是四項a a、b b、c c、d d,且它們分別占且它們分別占1 1位、位、3 3位、位、2 2位、位、2 2位(如下圖所示)。如果位(如下圖所示)。如果欲將欲將b b的值變?yōu)榈闹底優(yōu)? 6,則可以這樣:,則可以這樣:dataabcd7017(1)(1)將將b b項項(4 6(4 6位位) )清零清零 data = data & 0 x8f; data = data & 0 x8f; 或者或者 data = data & data = data & (74);(3)(3)將將d

23、atadata與與“64”64”進行按位或運算,即可實現將進行按位或運算,即可實現將b b的值變?yōu)榈闹底優(yōu)? 6 。1000111170(2)(2)將數將數6 6左移左移4 4位,使位,使110110成為成為4 - 64 - 6位位0110000070 x000 xxxxx110 xxxxdatadatadatadata|(64)|(64)(74)說明:其中說明:其中(1)(1)步中的步中的0 x8f0 x8f,稱為,稱為“屏蔽字屏蔽字”,即把,即把datadata中中b b的的信息屏蔽掉,而其它信息不受影響。信息屏蔽掉,而其它信息不受影響。182 2、通過位段來實現、通過位段來實現對對1 1

24、位或幾位的操作:位或幾位的操作:C C語言允許在一個結構體中語言允許在一個結構體中以位為單位來指定其成員所占內存的長度,這種以位為單位的成以位為單位來指定其成員所占內存的長度,這種以位為單位的成員稱為員稱為“位段位段”( (或或“位域位域”bit field)bit field)。例如:。例如:Struct packed_data unsigned a:2; unsigned b:6; unsigned c:4; unsigned d:4; int i;data;Struct packed_data unsigned a:2; unsigned b:3; unsigned c:4; int i

25、;Struct packed_data data;abcd i164462abc空閑空閑 i167 74327015233119關于位段的定義和引用的說明:關于位段的定義和引用的說明:1)1)位段成員的類型必須指定為位段成員的類型必須指定為unsigned intunsigned int型。型。2)2)若某一位段要從另一存儲單元若某一位段要從另一存儲單元( (字字) )單獨開始存放單獨開始存放, ,應這樣定義:應這樣定義:Struct packed_data unsigned a:1; unsigned b:2; unsigned :0; unsigned c:3; /* 在在Turbo C中表示中表示c從第從第3個字節(jié)開始存放個字節(jié)開始存放 */;3)3)可以定義無名字段,如:可以定義無名字段,如:Struct packed_data unsigned a:1; unsigned :2; / /* * 表示這兩位空間不用表示這兩位空間不用 * */ / unsigned b:3; unsigned c:4;204) 4) 一個位段必須存儲在同一存儲單元一個位段必須存儲在同一存儲單元

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論