C語言基礎(chǔ)_第12章_位運(yùn)算_第1頁
C語言基礎(chǔ)_第12章_位運(yùn)算_第2頁
C語言基礎(chǔ)_第12章_位運(yùn)算_第3頁
C語言基礎(chǔ)_第12章_位運(yùn)算_第4頁
C語言基礎(chǔ)_第12章_位運(yùn)算_第5頁
已閱讀5頁,還剩28頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、第十二章l 主要內(nèi)容12.112.1位運(yùn)算符和位運(yùn)算位運(yùn)算符和位運(yùn)算12.212.2位運(yùn)算舉例位運(yùn)算舉例12.312.3位段位段 概念l 位運(yùn)算是指按二進(jìn)制位進(jìn)行的運(yùn)算。因?yàn)樵谙到y(tǒng)軟件中,常要處理二進(jìn)制位的問題。l 例如:將一個(gè)存儲(chǔ)單元中的各二進(jìn)制位左移或右移一位,兩個(gè)數(shù)按位相加等。l 語言提供位運(yùn)算的功能,與其他高級(jí)語言(如PASCAL)相比,具有很大的優(yōu)越性。 12.1 位運(yùn)算符和位運(yùn)算運(yùn)算符運(yùn)算符 含義含義 運(yùn)算符運(yùn)算符 含義含義 按位與按位與 取反取反 | | 按位或按位或 右移右移(1)(1)位運(yùn)算符中除以外,均為二目(元)運(yùn)算符,位運(yùn)算符中除以外,均為二目(元)運(yùn)算符,即要求兩側(cè)各

2、有一個(gè)運(yùn)算量。即要求兩側(cè)各有一個(gè)運(yùn)算量。(2)(2)運(yùn)算量只能是整型或字符型的數(shù)據(jù),不能為實(shí)型運(yùn)算量只能是整型或字符型的數(shù)據(jù),不能為實(shí)型數(shù)據(jù)。數(shù)據(jù)。語言提供的位運(yùn)算符有:語言提供的位運(yùn)算符有: 12.1.1“按位與”運(yùn)算符()按位與是指:按位與是指:參加運(yùn)算的兩個(gè)數(shù)據(jù),按二進(jìn)制位進(jìn)行參加運(yùn)算的兩個(gè)數(shù)據(jù),按二進(jìn)制位進(jìn)行“與與”運(yùn)算。如果兩個(gè)相應(yīng)的二進(jìn)制位都為,則運(yùn)算。如果兩個(gè)相應(yīng)的二進(jìn)制位都為,則該位的結(jié)果值為;否則為。即:該位的結(jié)果值為;否則為。即:,例:例:并不等于,應(yīng)該是按位與運(yùn)算:并不等于,應(yīng)該是按位與運(yùn)算:注意:注意:如果參加如果參加& &運(yùn)算的是運(yùn)算的是負(fù)數(shù)(如負(fù)數(shù)(

3、如-3&-5-3&-5),則要以),則要以補(bǔ)碼形式表示為二進(jìn)制數(shù)補(bǔ)碼形式表示為二進(jìn)制數(shù),然后再按位進(jìn)行,然后再按位進(jìn)行“與與”運(yùn)算。運(yùn)算。 0000001100000011(3)(3)& & 0000010100000101(5)(5) 0000000100000001(1)(1) 3&5的值得的值得按位與的用途: 若想對(duì)一個(gè)存儲(chǔ)單元清零,即使其全部二進(jìn)制位若想對(duì)一個(gè)存儲(chǔ)單元清零,即使其全部二進(jìn)制位為,只要找一個(gè)二進(jìn)制數(shù),其中各個(gè)位符合以下為,只要找一個(gè)二進(jìn)制數(shù),其中各個(gè)位符合以下條件:條件:原來的數(shù)中為的位,新數(shù)中相應(yīng)位為。原來的數(shù)中為的位,新數(shù)中相應(yīng)

4、位為。然后使二者進(jìn)行運(yùn)算,即可達(dá)到清零目的。然后使二者進(jìn)行運(yùn)算,即可達(dá)到清零目的。(1) (1) 清零。清零。 例:例: 原有數(shù)為原有數(shù)為,另找一個(gè)數(shù),設(shè)它為,另找一個(gè)數(shù),設(shè)它為,這樣在原,這樣在原數(shù)為的位置上,該數(shù)的相數(shù)為的位置上,該數(shù)的相應(yīng)位值均為。將這兩個(gè)數(shù)應(yīng)位值均為。將這兩個(gè)數(shù)進(jìn)行運(yùn)算:進(jìn)行運(yùn)算: 0010101100101011& & 1001010010010100 0000000000000000 (2) (2) 取一個(gè)數(shù)中某些指定位。取一個(gè)數(shù)中某些指定位。 如有一個(gè)整數(shù)(個(gè)字節(jié)),想要取其如有一個(gè)整數(shù)(個(gè)字節(jié)),想要取其中的低字節(jié),只需將與中的低字節(jié),只需將與8

5、 8個(gè)個(gè)1 1按位與即可。按位與即可。 0 0 1 0 1 1 0 0 1 0 1 0 1 1 0 0abc0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 10 0 0 0 0 0 0 0 1 0 1 0 1 1 0 0 (3)(3)保留一位的方法:與一個(gè)數(shù)進(jìn)行運(yùn)算,保留一位的方法:與一個(gè)數(shù)進(jìn)行運(yùn)算,此數(shù)在該位取。此數(shù)在該位取。即:即:a=84,b=59a=84,b=59 c=a&b=16 c=a&b=16例:例:有一數(shù),想把其中左面第有一數(shù),想把其中左面第、位保留下來,運(yùn)算如下:、位保留下來,運(yùn)算如下: 0101010001010100(84)(84)&

6、& 0011101100111011(59)(59) 0001000000010000(16)(16) 12.1.2 “按位或”運(yùn)算符(|) 兩個(gè)相應(yīng)的二進(jìn)制位中只要有一個(gè)為,該位兩個(gè)相應(yīng)的二進(jìn)制位中只要有一個(gè)為,該位的結(jié)果值為。的結(jié)果值為。即即 | |,| |,| |,| |例:例: 060|017,060|017,將八進(jìn)制數(shù)將八進(jìn)制數(shù)6060與八進(jìn)制數(shù)與八進(jìn)制數(shù)1717進(jìn)行進(jìn)行按位或運(yùn)算。按位或運(yùn)算。 0011000000110000| | 0000111100001111 0011111100111111 應(yīng)用:應(yīng)用:按位或運(yùn)算常用來對(duì)一個(gè)數(shù)據(jù)的某按位或運(yùn)算常用來對(duì)一個(gè)數(shù)據(jù)的某些

7、位定值為。例如:如果想使一個(gè)數(shù)些位定值為。例如:如果想使一個(gè)數(shù)的低位改為,只需將與進(jìn)行的低位改為,只需將與進(jìn)行按位或運(yùn)算即可。按位或運(yùn)算即可。12.1.3“異或”運(yùn)算符() 異或運(yùn)算符異或運(yùn)算符也稱也稱XORXOR運(yùn)算符。它的規(guī)則是:運(yùn)算符。它的規(guī)則是:若參加運(yùn)算的兩個(gè)二進(jìn)制位若參加運(yùn)算的兩個(gè)二進(jìn)制位同號(hào)則結(jié)果為(假)同號(hào)則結(jié)果為(假) 異號(hào)則結(jié)果為(真)異號(hào)則結(jié)果為(真)即即:00=0:00=0,01=101=1,10=110=1, 11=011=0即即:071052=023 :071052=023 (八進(jìn)制數(shù))(八進(jìn)制數(shù)) 0011100100111001 0010101000101010

8、 0001001100010011 例:例:()() 使特定位翻轉(zhuǎn)使特定位翻轉(zhuǎn)設(shè)有,想使其低位翻設(shè)有,想使其低位翻轉(zhuǎn),即變?yōu)?,變?yōu)椤?梢詫⑺c轉(zhuǎn),即變?yōu)?,變?yōu)?。可以將它與進(jìn)行進(jìn)行運(yùn)算,即:運(yùn)算,即:運(yùn)算符應(yīng)用:運(yùn)算符應(yīng)用: 0111101001111010 0000111100001111 0111010101110101 運(yùn)算結(jié)果的低位正運(yùn)算結(jié)果的低位正好是原數(shù)低位的翻轉(zhuǎn)。好是原數(shù)低位的翻轉(zhuǎn)。可見,要使哪幾位翻轉(zhuǎn)就可見,要使哪幾位翻轉(zhuǎn)就將與其進(jìn)行將與其進(jìn)行運(yùn)算的該幾運(yùn)算的該幾位置為即可。位置為即可。因?yàn)樵瓟?shù)中的與進(jìn)行因?yàn)樵瓟?shù)中的與進(jìn)行運(yùn)算得,運(yùn)算得,得,故保留原數(shù)得,故保留原數(shù)。例如:例如:

9、01201200=01200=012()() 與相與相,保留原值,保留原值 0000101000001010 0000000000000000 0000101000001010()() 交換兩個(gè)值,不用臨時(shí)變量交換兩個(gè)值,不用臨時(shí)變量例如:,。例如:,。想將和的值互換,可以用以下賦值語句實(shí)現(xiàn):想將和的值互換,可以用以下賦值語句實(shí)現(xiàn):ab;ab;ba;ba;ab;ab; () (abab的結(jié)果,的結(jié)果,a a已變成)已變成)() (baba的結(jié)果,的結(jié)果,b b已變成)已變成)() (abab的結(jié)果,的結(jié)果,a a已變成)已變成) 執(zhí)行前兩個(gè)賦值語句:執(zhí)行前兩個(gè)賦值語句:“;”和和“;”相當(dāng)于相

10、當(dāng)于b=b(ab)b=b(ab)。 再執(zhí)行第三個(gè)賦值語句:再執(zhí)行第三個(gè)賦值語句: 。由于。由于a a的的值等于(值等于(),),b b的值等于(的值等于(),),因此,相當(dāng)于因此,相當(dāng)于a=a=,即,即a a的值等的值等于于,等于。,等于。 得到原來的值。得到原來的值。即等效于以下兩步:即等效于以下兩步: 12.1.4 “取反”運(yùn)算符() 是一個(gè)單目(元)運(yùn)算符,用來對(duì)一個(gè)二是一個(gè)單目(元)運(yùn)算符,用來對(duì)一個(gè)二進(jìn)制數(shù)按位取反,即將變,將變。例如進(jìn)制數(shù)按位取反,即將變,將變。例如,是對(duì)八進(jìn)制數(shù)(即二進(jìn)制數(shù),是對(duì)八進(jìn)制數(shù)(即二進(jìn)制數(shù))按位求反。)按位求反。 0000000000010101 000

11、0000000010101()() 1111111111101010 1111111111101010 ( (八進(jìn)制數(shù)八進(jìn)制數(shù)177752)177752) 12.1.5 左移運(yùn)算符() 左移運(yùn)算符是用來將一個(gè)數(shù)的各二進(jìn)制左移運(yùn)算符是用來將一個(gè)數(shù)的各二進(jìn)制位全部左移若干位。位全部左移若干位。 例如:例如:a=2a=) 右移運(yùn)算符是右移運(yùn)算符是a2a2表示將表示將a a的各二進(jìn)制位的各二進(jìn)制位右移右移2 2位,移到右端的低位被舍棄位,移到右端的低位被舍棄, ,對(duì)無符號(hào)對(duì)無符號(hào)數(shù)數(shù), ,高位補(bǔ)高位補(bǔ)0 0。例如:例如:a=017a=017時(shí)時(shí): : a a的值用二進(jìn)制形式表示為的值用二進(jìn)制形式表示為

12、0000111100001111, 舍棄低舍棄低2 2位位1111: a2=00000011a2=00000011右移一位相當(dāng)于除以右移一位相當(dāng)于除以2 2 右移右移n n位相當(dāng)于除以位相當(dāng)于除以2n2n。 在右移時(shí)在右移時(shí), ,需要注意符號(hào)位問題:需要注意符號(hào)位問題: 對(duì)無符號(hào)數(shù)對(duì)無符號(hào)數(shù), ,右移時(shí)左邊高位移入右移時(shí)左邊高位移入0 0;對(duì);對(duì)于有符號(hào)的值于有符號(hào)的值, ,如果原來符號(hào)位為如果原來符號(hào)位為0(0(該數(shù)為正該數(shù)為正),),則左邊也是移入則左邊也是移入0 0。如果符號(hào)位原來為。如果符號(hào)位原來為1(1(即負(fù)即負(fù)數(shù)數(shù)),),則左邊移入則左邊移入0 0還是還是1,1,要取決于所用的計(jì)算

13、要取決于所用的計(jì)算機(jī)系統(tǒng)。有的系統(tǒng)移入機(jī)系統(tǒng)。有的系統(tǒng)移入0,0,有的系統(tǒng)移入有的系統(tǒng)移入1 1。移。移入入0 0的稱為的稱為“邏輯右移邏輯右移”, ,即簡(jiǎn)單右移;移入即簡(jiǎn)單右移;移入1 1的稱為的稱為“算術(shù)右移算術(shù)右移”。 例:例: a a的值是八進(jìn)制數(shù)的值是八進(jìn)制數(shù)113755113755: a:1001011111101101 a:1001011111101101 (用二進(jìn)制形式表示)(用二進(jìn)制形式表示)a1: 0100101111110110 (a1: 0100101111110110 (邏輯右移時(shí)邏輯右移時(shí)) )a1: 1100101111110110 (a1: 1100101111

14、110110 (算術(shù)右移時(shí)算術(shù)右移時(shí)) ) 在有些系統(tǒng)中在有些系統(tǒng)中,a1,a1得八進(jìn)制數(shù)得八進(jìn)制數(shù)045766,045766,而在而在另一些系統(tǒng)上可能得到的是另一些系統(tǒng)上可能得到的是145766145766。Turbo CTurbo C和其和其他一些他一些C C編譯采用的是算術(shù)右移編譯采用的是算術(shù)右移, ,即對(duì)有符號(hào)數(shù)右即對(duì)有符號(hào)數(shù)右移時(shí)移時(shí), ,如果符號(hào)位原來為如果符號(hào)位原來為1 1,左面移入高位的是,左面移入高位的是1 1。12.1.7 12.1.7 位運(yùn)算賦值運(yùn)算符位運(yùn)算賦值運(yùn)算符 位運(yùn)算符與賦值運(yùn)算符可以組成復(fù)合賦值運(yùn)算符。位運(yùn)算符與賦值運(yùn)算符可以組成復(fù)合賦值運(yùn)算符。 例如例如: &

15、amp;=, |=, =, =, =, =例:例: a & = b相當(dāng)于相當(dāng)于 a = a & b a =2相當(dāng)于相當(dāng)于a = a 4 目的是使要取出的那幾位移到最右端目的是使要取出的那幾位移到最右端 未右移時(shí)的情況未右移時(shí)的情況 右移右移4位后的情況位后的情況 設(shè)置一個(gè)低設(shè)置一個(gè)低4 4位全為位全為1,1,其余全為其余全為0 0的數(shù)。的數(shù)。 ( 0 4) & ( 0 4 )程序如下:程序如下:#include void main() unsigned a,b,c,d; scanf(“%o”,&a); b=a4; c=(04); d=b&c; print

16、f(“%o,%dn%o,%dn”,a,a,d,d);運(yùn)行情況如下:運(yùn)行情況如下:(輸入)(輸入), 217 217 (的值)(的值), 13 13 (的值)(的值) 輸入的值為八進(jìn)制數(shù)輸入的值為八進(jìn)制數(shù)331331, 其二進(jìn)制形式為其二進(jìn)制形式為1101100111011001 經(jīng)運(yùn)算最后得到的經(jīng)運(yùn)算最后得到的d d為為0000110100001101 即八進(jìn)制數(shù),十進(jìn)制數(shù)即八進(jìn)制數(shù),十進(jìn)制數(shù)1313。例例12.2 12.2 循環(huán)移位。循環(huán)移位。要求將進(jìn)行右循環(huán)移位要求將進(jìn)行右循環(huán)移位 將右循環(huán)移位,將右循環(huán)移位,即將中原來左面即將中原來左面()位右()位右移位,原來右端移位,原來右端位移到最

17、左面位移到最左面位。位。 將的右端位先放到中的高位中,將的右端位先放到中的高位中,實(shí)現(xiàn)語句:();實(shí)現(xiàn)語句:(); 將右移位,其左面高位位補(bǔ),將右移位,其左面高位位補(bǔ),實(shí)現(xiàn)語句:;實(shí)現(xiàn)語句:; 將與進(jìn)行按位或運(yùn)算,即將與進(jìn)行按位或運(yùn)算,即| |;步驟:步驟: 程序如下:程序如下:#include void main() unsigned a,b,c; int n; scanf(“a=%o,n=%d”,&a,&n); b=an; c=c|b; printf(“%on%o”,a,c);運(yùn)行情況如下:運(yùn)行情況如下:, 3 運(yùn)行開始時(shí)輸入八進(jìn)制數(shù)運(yùn)行開始時(shí)輸入八進(jìn)制數(shù)157653157

18、653,即二進(jìn)制數(shù)即二進(jìn)制數(shù)11011111101010111101111110101011循環(huán)右移位后得二進(jìn)制數(shù)循環(huán)右移位后得二進(jìn)制數(shù)01111011111101010111101111110101即八進(jìn)制數(shù)即八進(jìn)制數(shù)7576575765 12.3 位段 信息的存取一般以字節(jié)為單位。實(shí)際上,有時(shí)信息的存取一般以字節(jié)為單位。實(shí)際上,有時(shí)存儲(chǔ)一個(gè)信息不必用一個(gè)或多個(gè)字節(jié),例如,存儲(chǔ)一個(gè)信息不必用一個(gè)或多個(gè)字節(jié),例如,“真真”或或“假假”用或表示,只需位即可。在計(jì)算機(jī)用或表示,只需位即可。在計(jì)算機(jī)用于過程控制、參數(shù)檢測(cè)或數(shù)據(jù)通信領(lǐng)域時(shí),控制用于過程控制、參數(shù)檢測(cè)或數(shù)據(jù)通信領(lǐng)域時(shí),控制信息往往只占一

19、個(gè)字節(jié)中的一個(gè)或幾個(gè)二進(jìn)制位,信息往往只占一個(gè)字節(jié)中的一個(gè)或幾個(gè)二進(jìn)制位,常常在一個(gè)字節(jié)中放幾個(gè)信息。常常在一個(gè)字節(jié)中放幾個(gè)信息??梢匀藶榈貙⒁粋€(gè)整型變量可以人為地將一個(gè)整型變量datadata分為幾部分。分為幾部分。 但是用這種方法給一個(gè)字節(jié)中某幾位賦但是用這種方法給一個(gè)字節(jié)中某幾位賦值太麻煩??梢晕欢谓Y(jié)構(gòu)體的方法。值太麻煩??梢晕欢谓Y(jié)構(gòu)體的方法。 怎樣向一個(gè)字節(jié)中的一個(gè)或幾個(gè)二進(jìn)制位賦值和改怎樣向一個(gè)字節(jié)中的一個(gè)或幾個(gè)二進(jìn)制位賦值和改變它的值呢?可以用以下兩種方法變它的值呢?可以用以下兩種方法: :(2 2)位段)位段 C C語言允許在一個(gè)結(jié)構(gòu)體中以位為單位來指語言允許在一個(gè)結(jié)構(gòu)體中以位為

20、單位來指定其成員所占內(nèi)存長(zhǎng)度,這種以位為單位的成定其成員所占內(nèi)存長(zhǎng)度,這種以位為單位的成員稱為員稱為“位段位段”或稱或稱“位域位域” ( bit field) ( bit field) 。利用位段能夠用較少的位數(shù)存儲(chǔ)數(shù)據(jù)。利用位段能夠用較少的位數(shù)存儲(chǔ)數(shù)據(jù)。 程序如下:程序如下:struct packed-data unsigned :;:; unsigned:;:; unsigned:;:; unsigned:;:; int ; data; (1 1)位段成員的類型必須指定為)位段成員的類型必須指定為unsignedunsigned或或intint類型。類型。(2 2) 若某一位段要從另一個(gè)字開始存放,可用以下形若某一位段要從另一個(gè)字開始存放,可用以下形式定義:式定義:unsigned :1;unsignedb:;

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論