kj-第11章位運(yùn)算ppt課件(全)_第1頁(yè)
kj-第11章位運(yùn)算ppt課件(全)_第2頁(yè)
kj-第11章位運(yùn)算ppt課件(全)_第3頁(yè)
kj-第11章位運(yùn)算ppt課件(全)_第4頁(yè)
kj-第11章位運(yùn)算ppt課件(全)_第5頁(yè)
已閱讀5頁(yè),還剩24頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、第11章 位運(yùn)算 本章概述 本章的學(xué)習(xí)目標(biāo)主要內(nèi)容1本章概述C語(yǔ)言有一個(gè)重要特點(diǎn)就是可以直接對(duì)二進(jìn)制位進(jìn)行操作,即位運(yùn)算。二進(jìn)制位簡(jiǎn)稱位(bit),其值為0或1。計(jì)算機(jī)真正執(zhí)行的正是由0和1構(gòu)成的機(jī)器指令,計(jì)算機(jī)內(nèi)數(shù)據(jù)也是由二進(jìn)制表示的。 數(shù)在計(jì)算機(jī)內(nèi)均是以補(bǔ)碼的形式存儲(chǔ)的 。本章介紹位運(yùn)算和位段結(jié)構(gòu)的有關(guān)知識(shí)。2本章的學(xué)習(xí)目標(biāo)本章教學(xué)目的:理解位運(yùn)算的概念,掌握基本位運(yùn)算運(yùn)算符的使用,理解位段的概念。本章教學(xué)重點(diǎn):基本位運(yùn)算運(yùn)算符的使用本章教學(xué)難點(diǎn):位段的概念3主要內(nèi)容11.1 位運(yùn)算符 11.2 位運(yùn)算 11.3 位運(yùn)算應(yīng)用舉例 11.4 位段結(jié)構(gòu) 411.1 位運(yùn)算符位運(yùn)算符功能舉例按位

2、取反a:對(duì)變量a的全部位取反左移 a右移 a2:將變量a的各位全部右移2位,對(duì)于無(wú)符號(hào)數(shù)和正整數(shù),高位補(bǔ)0;對(duì)于負(fù)整數(shù),高位補(bǔ)1(適用于turboc系統(tǒng))&按位與 a&b:對(duì)a與b的各對(duì)應(yīng)位進(jìn)行“按位與”運(yùn)算|按位或 a|b:對(duì)a與b的各對(duì)應(yīng)位進(jìn)行“按位或”運(yùn)算按位異或 ab:對(duì)a與b的各對(duì)應(yīng)位進(jìn)行“按位異或”運(yùn)算511.2 位運(yùn)算 取反運(yùn)算“”是一個(gè)單目運(yùn)算符,運(yùn)算量在運(yùn)算符之后,取反運(yùn)算的功能是將一個(gè)數(shù)據(jù)中所有位都取其相反值,即1變0,0變1。 運(yùn)算規(guī)則為: 1=0 0=1例11.1 對(duì)于無(wú)符號(hào)的字符型數(shù)據(jù)a=(18)10 =(00010010)2 ,則a等于(11101101)2 ,即(

3、237)10C程序如下:11.2.1 按位取反運(yùn)算6# include int main() unsigned char a=18,b; b=a; printf(“a=%d”,b); return 0; 運(yùn)行結(jié)果為: a= 237 注意以下程序與左面程序及運(yùn)行結(jié)果的區(qū)別: # include int main() char a=18,b; b=a; printf(“a=%d”,b); return 0;運(yùn)行結(jié)果:-19 前一個(gè)程序結(jié)果很好理解,后一個(gè)因?yàn)閍是帶符號(hào)數(shù)據(jù),因此a=(11101101)2的結(jié)果是一負(fù)數(shù)的補(bǔ)碼,轉(zhuǎn)換為原碼時(shí),第1位符號(hào)位不變,對(duì)剩余的部分先減1,再全部取反,因此得到的

4、二進(jìn)制原碼為:10010011,即十進(jìn)制的-19。 711.2 位運(yùn)算11.2.2 左移運(yùn)算 左移運(yùn)算“”是一個(gè)雙目運(yùn)算符,左移運(yùn)算的功能是將一個(gè)數(shù)據(jù)所有位向左移若干位,左邊(高位)移出的部分舍去,右邊(低位)自動(dòng)補(bǔ)零。 例11.2 對(duì)于無(wú)符號(hào)字符型數(shù)據(jù) a=(18)10 =(00010010)2 , a 3的結(jié)果是(10010000)2 ,即(144)108C程序如下: # include int main() unsigned char a=18, b; b=a3; printf(“a3=%d”,b); 運(yùn)行結(jié)果為: a3=144注意以下程序與左面程序的區(qū)別: # include int

5、main()char a=18,b; b=a3; printf(“a3=%d”,b); return 0; 運(yùn)行結(jié)果為: a3=-112 原因同前,對(duì)于帶符號(hào)數(shù)a,因a”是一個(gè)雙目運(yùn)算符,右移運(yùn)算的功能是將一個(gè)數(shù)據(jù)所有位向右移若干位,右邊(低位)移出的部分舍去,左邊(高位)移入的二進(jìn)制數(shù)分兩種情況:對(duì)于無(wú)符號(hào)數(shù)和正整數(shù),高位補(bǔ)0;對(duì)于負(fù)整數(shù),高位補(bǔ)1(適用于turboc系統(tǒng))。 例11.3 對(duì)于無(wú)符號(hào)字符型數(shù)據(jù) a=(18)10 =(00010010)2 , 則 a 3的結(jié)果是(00000010)2,即(2)1010C程序: # include int main() unsigned char

6、 a=18, b; b=a3; printf(“a3=%d”,b); return 0;運(yùn)行結(jié)果為: a3=21111.2 位運(yùn)算11.2.4 按位與運(yùn)算 按位“與”運(yùn)算符要求有兩個(gè)運(yùn)算量,其功能是將兩個(gè)運(yùn)算量的各個(gè)相應(yīng)位分別進(jìn)行“與”運(yùn)算。 運(yùn)算規(guī)則為: 1&1=1 0&1=0 1&0=0 0&0=0 例11.4 對(duì)于無(wú)符號(hào)數(shù)a=(173)10=(10101101)2, b=(203)10=(11001011)2, 則a&b = (10001001)2 =(137)10 10101101& 11001011 1000100112例11.5 對(duì)于有符號(hào)數(shù)a=(-83)10=(10101101)

7、2 , b=(-53)10=(11001011)2 , 則a&b = (10001001)2 =(-119)10 。以上二進(jìn)制形式是負(fù)數(shù)的補(bǔ)碼。C程序如右上所示。C程序: # include int main() unsigned char a=173,b=203,c; c=a&b; printf(“a&b=%d”,c); return 0;運(yùn)行結(jié)果為: a&b=137 10101101& 11001011 10001001C程序:# include int main() char a=-83,b=-53,c; c=a&b; printf(“a&b=%d”,c); return 0;運(yùn)行結(jié)果為

8、: a&b=-1191311.2 位運(yùn)算11.2.5 按位或運(yùn)算 按位“或”運(yùn)算符要求有兩個(gè)運(yùn)算量,其功能是將兩個(gè)運(yùn)算量的各個(gè)相應(yīng)位分別進(jìn)行“或”運(yùn)算。 運(yùn)算規(guī)則為: 1|1=1 0|1=1 1|0=1 0&0=0例11.6 對(duì)于無(wú)符號(hào)數(shù)a=(173)10=(10101101)2,b=(203)10=(11001011)2,則a|b = (11101111)2 =(239)10 10101101| 11001011 1110111114 例11.7 對(duì)于有符號(hào)數(shù) a=(-83)10=(10101101)2, b=(-53)10=(11001011)2, 則a|b = (11101111)2 =

9、(-17)10C程序: # include int main() unsigned char a=173,b=203,c; c=a|b; printf(“a|b=%d”,c); return 0; 運(yùn)行結(jié)果: a|b=239 10101101| 11001011 1110111115C程序: # include int main()char a=-83,b=-53,c; c=a|b; printf(“a|b=%d”,c); return 0; 運(yùn)行結(jié)果為: a|b= -171611.2 位運(yùn)算11.2.6 按位異或運(yùn)算 按位“異或”運(yùn)算符要求有兩個(gè)運(yùn)算量,其功能是將兩個(gè)運(yùn)算量的各個(gè)相應(yīng)位分別進(jìn)

10、行“異或”運(yùn)算。 運(yùn)算規(guī)則為: 11=0 01=1 10=1 0&0=0 。例11.8 對(duì)于無(wú)符號(hào)數(shù) a=(173)10=(10101101)2, b=(203)10=(11001011)2, 則ab = (11101111)2 =(102)10 10101101 11001011 01100110 C程序: # include int main()unsigned char a=173,b=203,c; c=ab; printf(“ab=%d”,c); return 0; 運(yùn)行結(jié)果: ab=102 1711.3 位運(yùn)算應(yīng)用舉例例11.9 對(duì)內(nèi)存中的二進(jìn)制數(shù)“01010100”進(jìn)行下列操作:

11、1. 用“按位與”實(shí)現(xiàn): (1)把存儲(chǔ)此二進(jìn)制數(shù)的內(nèi)存單元清零; (2)把此二進(jìn)制數(shù)的2到4位取出(從0位開始); (3)把此二進(jìn)制數(shù)的2、3、5位留下。 2. 用“按位或”運(yùn)算把此二進(jìn)制數(shù)后四位置1 (寫出實(shí)現(xiàn)方法) 。18(3)要把二進(jìn)制數(shù)2、3、5位留下, 與00101100進(jìn)行按位與即可, 其運(yùn)算過(guò)程為: 01010100& 00101100 000001002.把此二進(jìn)制數(shù)后四位置1,與00001111進(jìn)行按位或即可, 其運(yùn)算過(guò)程為: 01010100| 00001111 010111111.用按位與實(shí)現(xiàn):(1) 要把存儲(chǔ)此二進(jìn)制數(shù)的內(nèi)存 單元清零,與0按位與即可, 其運(yùn)算過(guò)程為:

12、01010100& 00000000 00000000(2)要取出二進(jìn)制數(shù)2到4位, 與00011100進(jìn)行按位與即可, 其運(yùn)算過(guò)程為: 01010100& 00011100 0001010019例11.10 編程將一個(gè)十六進(jìn)制整型數(shù)轉(zhuǎn)換為二進(jìn)制數(shù)。 設(shè)該整型數(shù)占16位。 將十六進(jìn)制數(shù)轉(zhuǎn)換為二進(jìn)制數(shù)的方法很多,這里我們利用位運(yùn)算來(lái)進(jìn)行處理,思路:對(duì)一個(gè)十六進(jìn)制整型數(shù)n的二進(jìn)制(16位)形式從最高位到最低位的每一位進(jìn)行測(cè)試,依次求出其值即可。 具體方法:設(shè)置一個(gè)屏蔽字mask(二進(jìn)制為1000 0000 0000 0000。其相應(yīng)的十六進(jìn)制形式為0 x8000),將mask與n進(jìn)行“與”運(yùn)算得出

13、的值如為0則最高位為0,否則最高位為1;再將mask右移一位后,與n進(jìn)行“與”運(yùn)算得出次高位,依此類推,求出每一位的值。20# include int main()unsigned int i,n,b,mask; mask=0 x8000; printf(Input a hex number to convert:); scanf(%x,&n); printf(nBinary of %0 x is:,n); for(i=0;i1; return 0; 運(yùn)行情況:Input a hex number to convert: f fBinary of f f is: 00000000-111111

14、11Input a hex number to convert: 127Binary of 0127 is:00000001-00100111 21例11.11 循環(huán)移位。 所謂循環(huán)移位是指:在移位時(shí)不丟失移位前原數(shù)據(jù)的所有位,將其作為另一端的補(bǔ)入位。 如:將11110001循環(huán)右移1位,應(yīng)為11111000。 11110001循環(huán)右移3位,應(yīng)為00111110。 22實(shí)現(xiàn)將無(wú)符號(hào)數(shù)a循環(huán)右移n位的方法: (1) 將a左移16-n位存入b中; (2) 將a右移n位存入c中; (3) 將b與c按位進(jìn)行“或運(yùn)算”,則結(jié)果便為所需結(jié)果。23# include int main()unsigned i

15、nt n,a,b,c,d; printf(Input a Hex number:); scanf(%x,&a); printf(nInput the number of bit to move:); scanf(%d,&n); b=an; d=b|c; printf(nThe result of move:%x,d); return 0;運(yùn)行情況:Input a Hex number:f2d3Input the number of bit to move:3The result of move:7e5a 2411.4 位段結(jié)構(gòu)1. 位段結(jié)構(gòu)的概念 位段結(jié)構(gòu)是一種結(jié)構(gòu)體類型,只不過(guò)是在結(jié)構(gòu)體中含

16、有以位為單位定義存儲(chǔ)長(zhǎng)度的成員。采用這種結(jié)構(gòu)可以節(jié)省存儲(chǔ)空間、方便某些特定的操作。 2 . 位段結(jié)構(gòu)的定義struct bytedata unsigned a : 2 ; /*占2位*/ unsigned b : 1 ; /*占1位*/ unsigned C: 3 ; /*占3位*/ unsigned d : 2 ; /*占2位*/ 位段結(jié)構(gòu)中位段的定義: unsigned : 例如25其存儲(chǔ)結(jié)構(gòu)如下圖:struct bytedata unsigned a : 2 ; /*占2位*/ unsigned b : 1 ; /*占1位*/ unsigned : 3 ; /*占3位,無(wú)字段名,不能引用

17、*/ unsigned d : 2 ; /*占2位*/ 如果需要可以跳過(guò)某些不用的位,只要將這些位段不指定位段名就無(wú)法引用。例如: 26 如果某一位段為位數(shù)為0的無(wú)名位段,則表示其下一個(gè)位段從另一個(gè)字節(jié)開始。 還可以在一個(gè)結(jié)構(gòu)體中混用位段與普通結(jié)構(gòu)體成員。例如:struct bytedata int i; /*非位段,整型,占2個(gè)字節(jié)*/ unsigned a : 2 ; /*占2位*/ unsigned b : 1 ; /*占1位*/ unsigned : 0 ; /*無(wú)名,0長(zhǎng)度,則下位段從下字節(jié)開始*/ unsigned c : 2 ; /*從第4個(gè)字節(jié)開始占2位*/27 對(duì)位段的引用方法和引用結(jié)構(gòu)體變量中的成員相同 ,例如,若data是struct bytedata類型的變量,即有: struct bytedata data ;則可以用后面的形式引用每個(gè)成員:data.i、data.a、data.b、data.c。 可以用下面形式輸出每個(gè)成員

溫馨提示

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