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

下載本文檔

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

文檔簡介

1

位運(yùn)算2概述前面介紹的各種運(yùn)算都是以字節(jié)作為最基本單位進(jìn)行的。但在很多系統(tǒng)程序中常要求在位(bit)一級進(jìn)行運(yùn)算或處理。C語言提供了位運(yùn)算的功能,這使得C語言也能像匯編語言一樣用來編寫系統(tǒng)程序。3位運(yùn)算符和位運(yùn)算C語言提供了六種位運(yùn)算符運(yùn)算符含義&按位與|按位或^按位異或~取反>>右移<<左移4一、按位與&運(yùn)算按位與運(yùn)算符“&”是雙目運(yùn)算符。其功能是參與運(yùn)算的兩數(shù)各對應(yīng)的二進(jìn)位相與。只有對應(yīng)的兩個二進(jìn)位均為1時,結(jié)果位才為1,否則為0。參與運(yùn)算的數(shù)以補(bǔ)碼方式出現(xiàn)。00001001(&)0000010100000001(9的二進(jìn)制補(bǔ)碼)(5的二進(jìn)制補(bǔ)碼)(1的二進(jìn)制補(bǔ)碼)0&0=00&1=01&0=01&1=1例如:9&5可寫算式如下:可見9&5=1。5按位與&的用途清零取一個數(shù)中的某些指定位00101011(&)0100010000000000001011001010110000000000111111110000000010101100abc001011001010110011111111000000000010110000000000abcb=(377)8c=a&b b=(177400)8c=a&b 6想保留哪一位,就與一個數(shù)進(jìn)行&運(yùn)算,此數(shù)在該位取101010100(&)0011101100010000保留左面的3、4、5、7、8位7

二、按位或|運(yùn)算按位或運(yùn)算符“|”是雙目運(yùn)算符。其功能是參與運(yùn)算的兩數(shù)各對應(yīng)的二進(jìn)位相或。只要對應(yīng)的兩個二進(jìn)位有一個為1時,結(jié)果位就為1。參與運(yùn)算的兩個數(shù)均以補(bǔ)碼出現(xiàn)。0|0=00|1=11|0=11|1=1例如:9|5可寫算式如下:00001001(|)0000010100001101(9的二進(jìn)制補(bǔ)碼)(5的二進(jìn)制補(bǔ)碼)(13的二進(jìn)制補(bǔ)碼)可見9|5=13。8按位或|的用途常用來對一個數(shù)據(jù)的某些位定值為1a|0377例如:a是一個整數(shù)(16位),如果有下式則低8位全置為1,高8位保留原樣9三、

按位異或∧運(yùn)算按位異或運(yùn)算符“∧”是雙目運(yùn)算符。其功能是參與運(yùn)算的兩數(shù)各對應(yīng)的二進(jìn)位相異或,當(dāng)兩對應(yīng)的二進(jìn)位相異時,結(jié)果為1。相同時,結(jié)果為0。參與運(yùn)算數(shù)仍以補(bǔ)碼出現(xiàn)0∧0=00∧1=11∧0=11∧1=0例如:9∧5可寫算式如下:00001001(∧)0000010100001100(9的二進(jìn)制補(bǔ)碼)(5的二進(jìn)制補(bǔ)碼)(12的二進(jìn)制補(bǔ)碼)可見9∧5=12。10按位異或∧的用途使特定位翻轉(zhuǎn)01111010(∧)0000111101110101與0相∧,保留原值

00001001(∧)00000000

0000100111交換兩個值,不用臨時變量例如:a=3,b=4,交換a和b

00000011(∧)00000100

00000111(∧)00000100

00000011(∧)00000111

00000100a=3b=4a=a∧b=7b=a∧b=3a=b∧a=4b=4a=7a=a∧bb=b∧a=b∧a∧b=a∧b∧b=a∧0=aa=a∧b=a∧b∧b∧a∧b=ba=a∧bb=b∧aa=a∧b12四、

取反~運(yùn)算求反運(yùn)算符~為單目運(yùn)算符,具有右結(jié)合性。其功能是對參與運(yùn)算的數(shù)的各二進(jìn)位按位求反。運(yùn)算級別較高(2級)例如:~9的運(yùn)算如下:(~)000010011111011013取反~的用途若一個整數(shù)a為16位,想使最低一位為0,可以用a=a&0177776如果將c源程序移植到以32位存放一個整數(shù)的計算機(jī)上,應(yīng)改用a=a&037777777776如上,移植性差,可改為:a=a&~114五、

左移<<運(yùn)算左移運(yùn)算符“<<”是雙目運(yùn)算符。其功能把“<<”左邊的運(yùn)算數(shù)的各二進(jìn)位全部左移若干位,由“<<”右邊的數(shù)指定移動的位數(shù),高位丟棄,低位補(bǔ)0。a的值二進(jìn)制形式a<<1a<<26401000000010000000010000000012701111111011111110011111110015說明左移1位相當(dāng)于乘2,左移2位相當(dāng)于乘4…,前提是被溢出舍棄的高位中不包含1左移比乘法運(yùn)算快,有些c編譯程序自動將乘2的運(yùn)算用左移1位來實現(xiàn),將乘2n的冪運(yùn)算處理為左移n位16六、

右移>>運(yùn)算右移運(yùn)算符“>>”是雙目運(yùn)算符。其功能是把“>>”左邊的運(yùn)算數(shù)的各二進(jìn)位全部右移若干位,“>>”右邊的數(shù)指定移動的位數(shù)。例如:設(shè)a=15,有式子a>>2表示把00001111右移為00000011(十進(jìn)制3)注意:對于有符號數(shù),在右移時,符號位將隨同移動。當(dāng)為正數(shù)時,最高位補(bǔ)0;而為負(fù)數(shù)時,符號位為1,最高位是補(bǔ)0或是補(bǔ)1取決于編譯系統(tǒng)的規(guī)定。移入0的稱為“邏輯右移”,即簡單右移,移入1的稱為“算術(shù)右移”,很多系統(tǒng)規(guī)定為補(bǔ)1。17七、

位運(yùn)算賦值運(yùn)算符位運(yùn)算符和賦值運(yùn)算符可以組成復(fù)合賦值運(yùn)算符&=、|=、>>=、<<=、∧=例如:a&=b相當(dāng)于a=a&b18八、

不同長度數(shù)據(jù)進(jìn)行位運(yùn)算如果兩個長度不同的數(shù)據(jù)進(jìn)行位運(yùn)算(例如:a為long型,b為int型,a&b),系統(tǒng)將二者右端對齊。如果b為正數(shù),則左側(cè)16位補(bǔ)0。如果b為負(fù)數(shù),則左側(cè)16位補(bǔ)1。如果b為無符號整數(shù)型,則左側(cè)補(bǔ)零。19位運(yùn)算的優(yōu)先級取反~→→右移>>和左移<<→→按位與&→→按位異或∧→→按位或|→→&=、|=、>>=、<<=、∧=20

九、位運(yùn)算舉例【例】取一個整數(shù)a從右端開始的4∽7位00000001010010110000000000010100a=337a>>4a=20c=~(~0<<4)c=150000000000001111b=a&c000000000000010021c=~(~0<<4)c=150000000000001111000000000000000011111111111111110~01111111111110000~(~0<<4)0000000000001111~0<<422main(){unsigneda,b,c,d;scanf(“%o”,&a);b=a>>4;c=~(~0<<4);d=b&c;printf(“%o,%d\n%o,%d\n”,a,a,d,d);}運(yùn)行情況:331↙331,21715,1323【例】循環(huán)移位1101111110101011a=(157653)80111101111110101c=(75765)8241101111110101011a=(157653)80001101111110101c=a>>30110000000000000b=a<<13d=b|c011110111111010125main(){unsigneda,b,c,d;intn;scanf(“a=%o,n=%d”,&a,&n);b=a<<(16-n);c=a>>n;d=c|b;printf(“%o\n%o”,a,d);}運(yùn)行情況:a=157653,n=3↙1576537576526

位段(位域)前面介紹的對內(nèi)存中信息的存取都以字節(jié)為單位。實際上有些信息的存取不必用一個或多個字節(jié),例如,“真”和“假”用0或1表示,只需1位即可。當(dāng)計算機(jī)用于過程控制、參數(shù)檢測或數(shù)據(jù)通訊領(lǐng)域時,控制信息往往只占一個字節(jié)的一個或幾個二進(jìn)制位,常常在一個字節(jié)中存放幾個信息。向一個字節(jié)中的一個或幾個二進(jìn)位賦值有如下兩種方法27(1)人為將一個整型變量data分為幾部分dataabcd28一、現(xiàn)設(shè)c的原值為0,想將c的值變?yōu)?20000dataabcd000000000000110012000000001100000012<<4data|12<<4110012<<4data|12<<4.29二、如果c的原值不為0,想將c的值變?yōu)?2data=data&(0177417)8abcd對c清零data1111111100001111(0177417)80000dataabcd30(0177417)8稱為“屏蔽字”,即把c以外的信息屏蔽起來不受影響,只使c變?yōu)?,但(0177417)8很難記,為此改為如下data=data&~(15<<4)data=data&(0177417)8

相當(dāng)于:0000000000001111000000001111000011111111000011111515<<4~(15<<4)31data=data&~(15<<4)|12<<4將12賦給c0000000000001111150000000010101010n首先取n右端4位的值n&15如果想將n右端4位的值賦予c0000000000001010n&150000data&~(15<<4)abcd32data=data&~(15<<4)|(n&15)<<4與c中已清零的data按位或左移4位(n&15)<<400000000101000000000data&~(15<<4)abcd1010abcd33(2)位段(位域)位段:c語言允許在一個結(jié)構(gòu)體中以位為單位來指定其成員所占內(nèi)存長度,這種以位為單位的成員稱為“位段”或“”位域”(bitfield)。這樣可以節(jié)省存儲空間。位段的定義和位域變量的說明struct

位域結(jié)構(gòu)名

{位域列表

};其中位域列表的形式為:

類型說明符

位域名:位域長度;

34位域變量的說明與結(jié)構(gòu)變量說明的方式相同。可采用先定義后說明,同時定義說明或者直接說明這三種方式。structbs{inta:8;intb:2;intc:6;};structbsdata;structbs{inta:8;intb:2;intc:6;}data;dataabc35位段中數(shù)據(jù)的引用位段的使用和結(jié)構(gòu)體成員的使用相同,一般形式為位段變量名·

位段名data.a=124data.b=2data.c=33注意位段允許的最大范圍。下面是錯的:data.b=8由于8的二進(jìn)制為1000,而data.b只有兩位,在此情況下,取1000的低2位,故data.b的值為0位域允許用各種格式輸出。36main(){structbs{unsigneda:1;unsignedb:3;unsignedc:4;}bit,*pbit;bit.a=1;bit.b=7;bit.c=15;printf("%d,%d,%d\n",bit.a,bit.b,bit.c);pbit=&bit;pbit->a=0;pbit->b&=3;pbit->c|=1;printf("%d,%d,%d\n",pbit->a,pbit->b,pbit->c);}37main(){structbs{unsigneda:1;unsignedb:3;unsignedc:4;}bit,*pbit;bit.a=1;bit.b=7;bit.c=15;printf("%d,%d,%d\n",bit.a,bit.b,bit.c);pbit=&bit;pbit->a=0;pbit->b&=3;pbit->c|=1;printf("%d,%d,%d\n",pbit->a,pbit->b,pbit->c);}例38說明2)一個位段必須存儲在同一個字節(jié)中,不能跨兩個字節(jié)。如一個字節(jié)所??臻g不夠存放另一位段時,應(yīng)從下一單元起存放該位段。也可以有意使某位段從下一單元開始。例如:structbs{unsigneda:4unsigned:0/*空域*/unsigned

溫馨提示

  • 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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論