




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(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)算過程為: 01010100& 00101100 000001002.把此二進(jìn)制數(shù)后四位置1,與00001111進(jìn)行按位或即可, 其運(yùn)算過程為: 01010100| 00001111 010111111.用按位與實(shí)現(xiàn):(1) 要把存儲(chǔ)此二進(jìn)制數(shù)的內(nèi)存 單元清零,與0按位與即可, 其運(yùn)算過程為:
12、01010100& 00000000 00000000(2)要取出二進(jìn)制數(shù)2到4位, 與00011100進(jìn)行按位與即可, 其運(yùn)算過程為: 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)體類型,只不過是在結(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位*/ 如果需要可以跳過某些不用的位,只要將這些位段不指定位段名就無(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ú)特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 與同學(xué)們談地理教學(xué)設(shè)計(jì) -2024-2025學(xué)年地理人教版七年級(jí)上冊(cè)
- 《第7課 開關(guān)量的生成》教學(xué)設(shè)計(jì)教學(xué)反思-2023-2024學(xué)年小學(xué)信息技術(shù)浙教版23六年級(jí)下冊(cè)
- ERCP病人的護(hù)理課件
- 2024-2025學(xué)年人教版初中美術(shù)九年級(jí)下冊(cè)教案
- 2024年高中物理 第二章 第3節(jié) 勻變速直線運(yùn)動(dòng)的位移與時(shí)間的關(guān)系教學(xué)設(shè)計(jì) 新人教版必修1
- 2024年五年級(jí)數(shù)學(xué)上冊(cè) 五 分?jǐn)?shù)的意義第5課時(shí) 分?jǐn)?shù)與除法(2)配套教學(xué)設(shè)計(jì) 北師大版
- 2024-2025學(xué)年高中歷史 第五單元 經(jīng)濟(jì)全球化的趨勢(shì) 第26課 經(jīng)濟(jì)全球化的趨勢(shì)教學(xué)教學(xué)設(shè)計(jì) 岳麓版必修2
- 2024秋八年級(jí)英語(yǔ)上冊(cè) Unit 2 How often do you exercise Section B(1a-2e)教學(xué)設(shè)計(jì) (新版)人教新目標(biāo)版
- 藥品驗(yàn)收養(yǎng)護(hù)操作規(guī)程
- 2024-2025學(xué)年高中物理 第九章 固體、液體和物態(tài)變化 4 物態(tài)變化中的能量交換教學(xué)設(shè)計(jì)1 新人教版選修3-3
- 公司組織架構(gòu)圖(可編輯模版)
- 機(jī)電安裝總進(jìn)度計(jì)劃?rùn)M道圖
- 起重吊裝作業(yè)安全綜合驗(yàn)收記錄表
- 常規(guī)檢泵設(shè)計(jì)培訓(xùn)
- 園林綠化工程監(jiān)理實(shí)施細(xì)則(完整版)
- 夏季防溺水安全知識(shí)主題班會(huì)課件【愛生命防溺水】
- 夢(mèng)想(英語(yǔ)演講稿)PPT幻燈片課件(PPT 12頁(yè))
- 中國(guó)聯(lián)通員工績(jī)效管理實(shí)施計(jì)劃方案
- 法院刑事審判庭速裁庭廉政風(fēng)險(xiǎn)防控責(zé)任清單
- IEC60335-1(中文)
- 土方填筑碾壓試驗(yàn)報(bào)告
評(píng)論
0/150
提交評(píng)論