第十六次課(位運算)_第1頁
第十六次課(位運算)_第2頁
第十六次課(位運算)_第3頁
第十六次課(位運算)_第4頁
第十六次課(位運算)_第5頁
已閱讀5頁,還剩36頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、12前面介紹的各種運算都是以字節(jié)作為最基前面介紹的各種運算都是以字節(jié)作為最基本單位進行的。本單位進行的。 但在很多系統(tǒng)程序中常要求但在很多系統(tǒng)程序中常要求在位在位(bit)一級進行運算或處理。語言提供一級進行運算或處理。語言提供了位運算的功能,這使得語言也能像匯編了位運算的功能,這使得語言也能像匯編語言一樣用來編寫系統(tǒng)程序。語言一樣用來編寫系統(tǒng)程序。3語言提供了六種位運算符語言提供了六種位運算符運算符運算符含義含義&按位與按位與|按位或按位或按位異或按位異或取反取反右移右移左移左移4 按位與運算符按位與運算符“&”是雙目運算符。其功能是參與是雙目運算符。其功能是參與運算的兩數(shù)各對應的二進位相與

2、。只有對應的兩運算的兩數(shù)各對應的二進位相與。只有對應的兩個二進位均為個二進位均為1時,結(jié)果位才為時,結(jié)果位才為1,否則為,否則為0。參。參與運算的數(shù)以與運算的數(shù)以補碼補碼方式出現(xiàn)。方式出現(xiàn)。 00001001(&) 00000101 00000001(9(9的二進制補碼的二進制補碼) )(5(5的二進制補碼的二進制補碼) )(1(1的二進制補碼的二進制補碼) )0&0=00&1=01&0=01&1=1例如:例如:9 9&5 5可寫算式如下:可寫算式如下: 可見可見9 9&5=15=1。5清零清零取一個數(shù)中的某些指定位取一個數(shù)中的某些指定位 00101011(&) 01000100 000000

3、0000101100 1010110000000000 1111111100000000 10101100abc00101100 1010110011111111 0000000000101100 00000000abcb=(377)8 c=a&bb=(177400)8 c=a&b6 想保留哪一位,就與一個數(shù)進行想保留哪一位,就與一個數(shù)進行&運算,此運算,此數(shù)在該位取數(shù)在該位取1 01010100(&) 00111011 00010000保留左面的保留左面的3、4、5、7、8位位7 按位或運算符按位或運算符“| |”是雙目運算符。其功能是雙目運算符。其功能是參與運算的兩數(shù)各對應的二進位相或。是

4、參與運算的兩數(shù)各對應的二進位相或。只要對應的兩個二進位有一個為只要對應的兩個二進位有一個為1 1時,結(jié)果時,結(jié)果位就為位就為1 1。參與運算的兩個數(shù)均以補碼出現(xiàn)。參與運算的兩個數(shù)均以補碼出現(xiàn)。0| |0=00| |1=11| |0=11| |1=1例如:例如:9 9| |5 5可寫算式如下:可寫算式如下: 00001001(|) 00000101 00001101(9(9的二進制補碼的二進制補碼) )(5(5的二進制補碼的二進制補碼) )(13(13的二進制補碼的二進制補碼) )可見可見9 9|5=135=13。8 常用來對一個數(shù)據(jù)的某些位定值為常用來對一個數(shù)據(jù)的某些位定值為1a|0377例如

5、:例如:a是一個整數(shù)(是一個整數(shù)(16位),如果有下式位),如果有下式則低則低8位全置為位全置為1,高,高8位保留原樣位保留原樣9按位異或運算符按位異或運算符“”是雙目運算符。其功能是參是雙目運算符。其功能是參與運算的兩數(shù)各對應的二進位相異或,當兩對應與運算的兩數(shù)各對應的二進位相異或,當兩對應的二進位相的二進位相異異時,結(jié)果為時,結(jié)果為1。相。相同同時,結(jié)果為時,結(jié)果為0。參與運算數(shù)仍以補碼出現(xiàn)參與運算數(shù)仍以補碼出現(xiàn) 00=001=110=111=0例如:例如:9 95 5可寫算式如下:可寫算式如下: 00001001() 00000101 00001100(9(9的二進制補碼的二進制補碼)

6、)(5(5的二進制補碼的二進制補碼) )(12(12的二進制補碼的二進制補碼) )可見可見9 95=125=12。10 使特定位翻轉(zhuǎn)使特定位翻轉(zhuǎn) 01111010() 00001111 01110101 與與0相相,保留原值,保留原值 00001001() 00000000 0000100111 交換兩個值,不用臨時變量交換兩個值,不用臨時變量例如:例如:a=3, b=4,交換,交換a和和b 00000011() 00000100 00000111() 00000100 00000011() 00000111 00000100a=3b=4a=ab=7b=ab=3a=ba=4b=4a=7a=ab

7、b=ba= bab=abb=a0=aa=ab=abbab=ba=abb=baa=ab12 求反運算符求反運算符為單目運算符,具有右結(jié)合為單目運算符,具有右結(jié)合性。其功能是對參與運算的數(shù)的各二進位性。其功能是對參與運算的數(shù)的各二進位按位求反。運算級別較高(按位求反。運算級別較高(2 2級)級)例如:例如: 9 9的運算如下:的運算如下: () 00001001 1111011013若一個整數(shù)若一個整數(shù)a為為16位,想使最低一位為位,想使最低一位為0,可以用,可以用a=a&0177776如果將如果將c源程序移植到以源程序移植到以32位存放一個整數(shù)的計算位存放一個整數(shù)的計算機上,應改用機上,應改用a

8、=a&037777777776如上,移植性差,可改為:如上,移植性差,可改為:a=a&114 左移運算符左移運算符“”是雙目運算符。其功能把是雙目運算符。其功能把“ ”左邊的運算數(shù)的各二進位全部左移左邊的運算數(shù)的各二進位全部左移若干位,由若干位,由“”右邊的數(shù)指定移動的位數(shù),右邊的數(shù)指定移動的位數(shù),高位丟棄,低位補高位丟棄,低位補0 0。a的值的值二進制形式二進制形式a1a”是雙目運算符。其功能是是雙目運算符。其功能是把把“ ”左邊的運算數(shù)的各二進位全部右左邊的運算數(shù)的各二進位全部右移若干位,移若干位,“”右邊的數(shù)指定移動的位數(shù)。右邊的數(shù)指定移動的位數(shù)。 例如:設例如:設 a=15,有式子,有

9、式子a2表示把表示把00001111右移為右移為00000011(十進制十進制3)注意注意:對于有符號數(shù),在右移時,符號位將隨同移動。:對于有符號數(shù),在右移時,符號位將隨同移動。當為正數(shù)時,最高位補當為正數(shù)時,最高位補0;而為負數(shù)時,符號位為;而為負數(shù)時,符號位為1,最高位是補最高位是補0或是補或是補1 取決于編譯系統(tǒng)的規(guī)定。移入取決于編譯系統(tǒng)的規(guī)定。移入0的稱為的稱為“邏輯右移邏輯右移”,即簡單右移,移入,即簡單右移,移入1的稱為的稱為“算術右移算術右移”,很多系統(tǒng)規(guī)定為補,很多系統(tǒng)規(guī)定為補1。17位運算符和賦值運算符可以組成復合賦值運算符位運算符和賦值運算符可以組成復合賦值運算符&=、|=

10、、=、和左移和左移=、4a=20c=(04)c=150 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1b=a&c0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 021c=(04)c=150 0 0 0 0 0 0 0 0 0 0 0 1 1 1 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 01 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1001 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0(04)0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 104; c=(030 1 1 0 0 0 0 0 0 0 0 0 0

11、 0 0 0b=a13d=b|c0 1 1 1 1 0 1 1 1 1 1 1 0 1 0 125main()unsigned a, b, c, d; int n; scanf(“a=%o,n=%d”, &a, &n); b=an; d=c|b; printf(“%on%o”, a, d);運行情況運行情況:a=157653,n=3157653157653757657576526 前面介紹的對內(nèi)存中信息的存取都以字節(jié)為單位。前面介紹的對內(nèi)存中信息的存取都以字節(jié)為單位。實際上有些信息的存取不必用一個或多個字節(jié),實際上有些信息的存取不必用一個或多個字節(jié),例如,例如,“真真”和和“假假”用用0 0或

12、或1 1表示,只需表示,只需1 1位即可。位即可。當計算機用于當計算機用于過程控制過程控制、參數(shù)檢測參數(shù)檢測或或數(shù)據(jù)通訊數(shù)據(jù)通訊領領域時,控制信息往往只占一個字節(jié)的一個或幾個域時,控制信息往往只占一個字節(jié)的一個或幾個二進制位,常常在一個字節(jié)中存放幾個信息。二進制位,常常在一個字節(jié)中存放幾個信息。 向一個字節(jié)中的一個或幾個二進位賦值有如下兩向一個字節(jié)中的一個或幾個二進位賦值有如下兩種方法種方法27dataabcd28現(xiàn)設現(xiàn)設c的原值為的原值為0,想將,想將c的值變?yōu)榈闹底優(yōu)?20 0 0 0dataabcd0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0120 0 0 0 0 0

13、0 0 1 1 0 0 0 0 0 0124data|1241 1 0 0124data|124.29如果如果c的原值不為的原值不為0,想將,想將c的值變?yōu)榈闹底優(yōu)?2data=data&(0177417)8abcd對對c清零清零data1 1 1 1 1 1 1 1 0 0 0 0 1 1 1 1(0177417)80 0 0 0dataabcd30 (0177417)8稱為稱為“屏蔽字屏蔽字”,即把,即把c以以外的信息屏蔽起來不受影響,只使外的信息屏蔽起來不受影響,只使c變?yōu)樽優(yōu)?,但但(0177417)8很難記,為此改為如下很難記,為此改為如下data=data& (154)data=d

14、ata&(0177417)8 相當于:相當于:0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 10 0 0 0 0 0 0 0 1 1 1 1 0 0 0 01 1 1 1 1 1 1 1 0 0 0 0 1 1 1 115154(154)31data=data& (154) |124將將12賦給賦給c0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1150 0 0 0 0 0 0 0 1 0 1 0 1 0 1 0n 首先取首先取n右端右端4位的值位的值n&15如果想將如果想將n右端右端4位的值賦予位的值賦予c0 0 0 0 0 0 0 0 0 0 0 0 1 0 1

15、 0n&150 0 0 0data &(154)abcd32data=data&(154)|(n&15)4 與與c中已清零的中已清零的data按位或按位或 左移左移4位位(n&15)40 0 0 0 0 0 0 0 1 0 1 0 0 0 0 00 0 0 0data &(15a=0; pbit-b&=3; pbit-c|=1; printf(%d,%d,%dn,pbit-a,pbit-b,pbit-c);37main()struct bs unsigned a:1; unsigned b:3; unsigned c:4; bit,*pbit; bit.a=1; bit.b=7; bit.c=

16、15; printf(%d,%d,%dn,bit.a,bit.b,bit.c); pbit=&bit; pbit-a=0; pbit-b&=3; pbit-c|=1; printf(%d,%d,%dn,pbit-a,pbit-b,pbit-c);382)2)一個位段必須存儲在同一個字節(jié)中,不能跨兩個字節(jié)。一個位段必須存儲在同一個字節(jié)中,不能跨兩個字節(jié)。如一個字節(jié)所??臻g不夠存放另一位段時,應從下一如一個字節(jié)所??臻g不夠存放另一位段時,應從下一單元起存放該位段。也可以有意使某位段從下一單元單元起存放該位段。也可以有意使某位段從下一單元開始。例如:開始。例如:struct bs unsigned

17、a:4 unsigned :0 /*空域空域*/ unsigned b:4 /*從下一單元開始存放從下一單元開始存放*/ unsigned c:4 1)1)位段成員的類型必須指定為位段成員的類型必須指定為unsignedunsigned或或intint類型類型393)3)由于位由于位段段不允許跨兩個字節(jié),因此位不允許跨兩個字節(jié),因此位段段的的長度不能大于一個字節(jié)的長度,也就是說長度不能大于一個字節(jié)的長度,也就是說不能超過不能超過8 8位二進位。不能定義位段數(shù)組。位二進位。不能定義位段數(shù)組。4)4)位位段段可以無位可以無位段段名,這時它只用來作填充名,這時它只用來作填充或調(diào)整位置。無名的位或調(diào)整

18、位置。無名的位段段是不能使用的。是不能使用的。例如:例如:struct k int a:1 int :2 /*該該2位不能使用位不能使用*/ int b:3 int c:2 ;405)5)位位段段可以用整型格式輸出,也可用可以用整型格式輸出,也可用%u%u、%o%o、%x%x等各式輸出等各式輸出6)6)位位段段可以在數(shù)值表達式中引用,它會被系可以在數(shù)值表達式中引用,它會被系統(tǒng)自動地轉(zhuǎn)換成整型數(shù)。如下是對的統(tǒng)自動地轉(zhuǎn)換成整型數(shù)。如下是對的printf(“%d,%d,%d”, data.a, data.b, data.c);data.a+5/data.b411. 位運算是語言的一種特殊運算功能,它是以位運算是語言的一種特殊運算功能,它是以二進制位為單位進行運算的。位運算符只有邏輯二進制位為單位進行運算的。位運算符只有邏輯運算和移位運算兩類。位運算符可以與賦值符一運算和移位運算兩類。位運算符可以與賦值符一起組成復合賦值符。如起組成復合賦值符。如&=,|=,=,=,=等。等。2.

溫馨提示

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

評論

0/150

提交評論