![大一上語言基礎(chǔ)13版_第1頁](http://file4.renrendoc.com/view/6025d5befaa6544cb360f879f610ef2b/6025d5befaa6544cb360f879f610ef2b1.gif)
![大一上語言基礎(chǔ)13版_第2頁](http://file4.renrendoc.com/view/6025d5befaa6544cb360f879f610ef2b/6025d5befaa6544cb360f879f610ef2b2.gif)
![大一上語言基礎(chǔ)13版_第3頁](http://file4.renrendoc.com/view/6025d5befaa6544cb360f879f610ef2b/6025d5befaa6544cb360f879f610ef2b3.gif)
![大一上語言基礎(chǔ)13版_第4頁](http://file4.renrendoc.com/view/6025d5befaa6544cb360f879f610ef2b/6025d5befaa6544cb360f879f610ef2b4.gif)
![大一上語言基礎(chǔ)13版_第5頁](http://file4.renrendoc.com/view/6025d5befaa6544cb360f879f610ef2b/6025d5befaa6544cb360f879f610ef2b5.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、1功能(1)取出或判斷數(shù)據(jù)中指定的位例如,如果要取short型變量x的低字節(jié)(即低八位),則可以作如下運算: x & 0 x00ff。如果要取短整型short變量x的高字節(jié)(即高八位),則可以作如下運算: x & 0 xff00例如, 判斷char型變量x的第3位是否為1(最低位為第0位)if ( (x & 0 x08) != 0) 或者if (x & 0 x08 )若條件表達式“(x & 0 x08) != 0”的值為1(真),則表示x的第3位為1,否則表示x的第3位為0。特別要注意:由于“按位與”運算符“&”的優(yōu)先級要低于關(guān)系運算符“!=”,因此,表達式“(x & 0 x08)”外面的一對
2、圓括號不能省略。“按位與”運算符(&)特別要的是,如果參加“按位與”運算的對象為負(fù)整數(shù),則在計算機中是以補碼形式表示的。例如,負(fù)字符型數(shù)-13(二進制補碼的十六進制表示為 0 xf3)與字符型數(shù)21(十六進制表示為0 x15)進行“按位與”如下: -13&21=17,即0 xf3&0 x15=0 x11。1 1 1 1 0 0 1 1-13的二進制數(shù)補碼表示(&) 0 0 0 1 0 1 0 121的二進制數(shù)補碼(正數(shù)的補碼是其本身)0 0 0 1 0 0 0 1運算優(yōu)先級由高到低:!(邏輯非) - 按位取反 -算術(shù)運算符-運算符 - 關(guān)系運算符- 按位與&、按位異或、按位或| - & - |
3、 - 賦值運算符“按位與”運算符(&)若兩個運算對象的對應(yīng)二進制位均是1,則結(jié)果的對規(guī)則 應(yīng)位是1,否則為0。即對應(yīng)二進制位上可能的“按位與”運算組合為 0&0=0,0&1=0,1&0=0,1&1=1例如,字符型數(shù)(假設(shè)一個字符型數(shù)占8位二進制位,下同)13(十六0 0 0 0 1 1 0 1 13的二進制數(shù)進制表示為0 x0d)與字符型數(shù)21(&)0 0 0 1 0 1 0 1 21的二進制數(shù)(十六進制表示為0 x15)進行“按0 0 0 0 0 1 0 1位與”如下:13&21=5, 即0 x0d&0 x15=0 x05。13.1 二進制位運算位運算指對二進制位進行的運算。每個二進制位中只
4、能存放0或1。通常,將一個數(shù)據(jù)用二進制數(shù)表示后,最右邊的二進制位稱為最低位(第0位),最左邊的二進制位為最。C語言提供了六種位運算符注意位 運 算 符意 義 在這六種位運算符中,其中的按位取反是單目運算符,只有一個&按位與運算對象,其他均為雙目運算符,|按位或有兩個運算對象。按位異或 位運算的運算對象只能是整型按位取反右移或char型數(shù)據(jù),但不能是實型數(shù)據(jù)。第13章 位運算二進制位運算位段程序舉例計算機程序設(shè)計基礎(chǔ)(1)- C語言程序設(shè)計(13)sunjiason電子工程系 信息認(rèn)知與智能系統(tǒng)羅姆樓6-104:/627961932015.1.2“按位或”運算通常用于把一個數(shù)據(jù)的某些位置為1,而
5、其余位不變。例如,要將short 型變量x的低字節(jié)(即低八位)置1,而高字節(jié)(即高八位)不變,則可以用如下賦值語句:x=x | 0 x00ff; 或x |= 0 x00ff;如果要將short型變量x的高字節(jié)置1,而低字節(jié)不變,則可以用如下賦值語句:x=x|0 xff00; 或x |= 0 xff00;又如,為了將 型變量x的第0位與第4位強置1,而其余位不變,則可以用如下賦值語句:x=x | 0 x00000011; 或x |= 0 x00000011;“按位或”運算符(|)“按位或”運算符(|)若兩個運算對象的對應(yīng)二進制位中有一個是1,則結(jié)規(guī)則 果的對應(yīng)位是1,否則為0。即對應(yīng)二進制位上可
6、能的“按位或”運算組合為0|0=0,0|1=1,1|0=1,1|1=1例如, char整數(shù)13(十六進制表示0 0 0 0 1 1 0 1 13的二進制數(shù)為0 x0d)與char整數(shù)21(十六進制表示為0 x15)進行“按位或”如下:(|) 0 0 0 1 0 1 0 1 21的二進制數(shù)因此,13|21=29,即0 x0d|0 x15=0 x1d。 0 0 0 1 1 1 0 1又如,char型數(shù)-13(二進制補碼的十六進制表示為0 xf3)與char型數(shù)21(十六進制表示為0 x15)進行“按位或”。 1 1 1 1 0 0 1 1-13的二進制數(shù)補碼表示(|) 0 0 0 1 0 1 0
7、121的二進制數(shù)補碼(正數(shù)的補碼是其本身)1 1 1 1 0 1 1 1因此,-13|21=-9,即0 xf3|0 x15=0 xf7#include main( )k,a10=23,14,24,31,46,55,33,68,27,40;for (k=0; k10; k+) pr f(5d,ak);pr f(n);for (k=0; k 10; k+)ak &= 0 xfe; /*將正整數(shù)轉(zhuǎn)換為不大于它的最大偶數(shù)*/ for (k=0; k 10; k+)pr f(5d,ak);pr f(n);上述程序的運行結(jié)果為23 14 24 31 46 55 33 68 27 4022 14 24 30
8、 46 54 32 68 26 40注意:在某些情況下,&可替代邏輯&:比如: if (a=0) & (b=0)寫作: if (a=0) & (b=0)是等價的。但前一個執(zhí)行效率更高,因為a不為0時,不再判斷b=0?!纠?3-1】 編制一個C程序,其功能是將正整型數(shù)組中所有元素轉(zhuǎn)換為不大于它的最大偶數(shù),并顯示輸出。為了將一個正整數(shù)轉(zhuǎn)換為不大于它的最大偶數(shù),只需將該正整數(shù)所對應(yīng)的二進制數(shù)的最低位清零即可,即用 0 x e與該正整數(shù)作“按位與”運算。其C程序如下:(2)將數(shù)據(jù)中的指定位清零例如,要將短整型short變量x的低字節(jié)(即低八位)清零,則可以用如下賦值語句:x=x & 0 xff00;
9、或 x &= 0 xff00;這里0 xff00 被稱為掩碼(mask)。如果要將短整型short變量x的高字節(jié)(即高八位)清零,則可以用如下賦值語句:x=x & 0 x00ff; 或 x &= 0 x00ff;如果要將整型 變量x的高16位清零,則可以用如下賦值語句:x=x & 0 x0000 f;或 x &= 0 x0000 f;又如,為了將短整型short變量x的第4位清零,則可以用如下賦值語句:x=x & 0 xffef; 或 x &= 0 xffef;判斷某一位是否為1,經(jīng)常用來判斷是否滿足某個特性。比如,判斷一個從文件目錄中讀入的某文件屬性是否是子目錄:if (Win32_Find
10、_Data dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)此語句絕對不能寫成:if (Win32_Find_Data dwFileAttributes = FILE_ATTRIBUTE_DIRECTORY)因為一個文件的屬性的包含多種情況,比如,可能Win32_Find_Data.dwFileAttributes = 0 x00000011表示此文件既是目錄(FILE_ATTRIBUTE_DIRECTORY=0 x00000010)又是只讀的(FILE_ATTRIBUTE_READONLY=0 x00000001)。3“按位取反”運算符()按位取反”運
11、算符()將運算對象中的各二進制位值取反,即將0變規(guī)則為1,1變?yōu)?。對應(yīng)二進制位上可能的“按位取反”運算組合為0=1,1=0例如, 對char型數(shù)13(十六 () 0 0 0 0 1 1 0 1 13的二進制數(shù)進制表示為0 x0d)進行“按位取反”運算如下:1 1 1 1 0 0 1 0因此,13= -14,即0 x0d=0 xf2?!边\算符()規(guī)則 將運算對象中的每個二進制位向動若干位,從左邊移出去的部分被丟棄,右邊空出的低位部分補0。例如:若x=3; x = x 3; 則x值為24,相當(dāng)于x=x*8; 8=23一般來說,將整數(shù)k位,相當(dāng)于將該整數(shù)乘以2k 。性質(zhì)設(shè)x與y均為整型數(shù)據(jù),則有
12、(xy)y=x利用“按位異或”的這個性質(zhì),可以實現(xiàn)不借助于第三者交換兩個整型變量的值:x=xy; y=xy; x=xy;性質(zhì)使數(shù)據(jù)中的某些位取反,即將0變?yōu)?,1變?yōu)?。例如,要將short型變量x的低字節(jié)(即低八位)按位取反,而高字節(jié)(即高八位)不變,則可以用如下賦值語句: x=x0 x00ff;又如,為了將short型變量x的第0位與第4位取反,而其余位不變,則可以用如下賦值語句:x=x0 x0011;同一個數(shù)據(jù)進行異或運算后,其結(jié)果為0。利用異或運算的這個性質(zhì),可以將變量清零。例如,為了將 型變量x清零,則可以用如下賦值語句:;“按位異或”運算符() “按位異或”運算符()若兩個運算對象
13、的對應(yīng)二進制位不相等,則結(jié)果的規(guī)則 對應(yīng)位是1,否則為0。即對應(yīng)二進制位上可能的“按位異或”運算組合為 00=0,01=1,10=1,11=0例如, char型數(shù)13(十六進制表0 0 0 0 1 1 0 1 13的二進制數(shù)示為0 x0d)與char型數(shù)21(十六 () 0 0 0 1 0 1 0 1 21的二進制數(shù)進制表示為0 x15)進行“按位異 或”如下:0 0 0 1 1 0 0 0因此,1321=24,即0 x0d0 x15=0 x18。 按位異或又被稱為:“不進位加”又如,char型數(shù)-13(二進制補碼的十六進制表示為0 xf3)與char型數(shù)21(十六進制表示為0 x15)進行“
14、按位異或”如下:1 1 1 1 0 0 1 1 -13的二進制數(shù)補碼表示()00 0 1 0101 21的二進制數(shù)補碼(正數(shù)的補碼是其本身)1 1 1 0 0 1 1 0因此,-1321=-26,即0 xf30 x15=0 xe6#include main( )k, a10=23,14,24,31,46,55,33,68,27,40;for (k=0; k10; k+) pr f(5d, ak); pr f(n);for (k=0; k10; k+)ak |= 0 x00000001; /*將正整數(shù)轉(zhuǎn)換為不小于它的最小奇數(shù)*/for (k=0; k 2; 則x值為3,相當(dāng)于x=x/4; 4=2
15、2一般來說,將整數(shù)算術(shù)右移k位,相當(dāng)于將該整數(shù)除以2k 。13.1.6 “右移”運算符() “右移”運算符()將運算對象中的每個二進制位向右移動若干位,從規(guī)則 右邊移出去的低位部分被丟棄。但左邊空出的部分是補0還是補1,要視下列具體情況而定:若右移對象為無符號整型數(shù),則右移后左邊空出的部分補0。若右移對象為一般整型數(shù)或字符型數(shù)據(jù),當(dāng)該數(shù)據(jù)的最為0(對于一般整型來說即為正數(shù)),則右移后左邊空出的部分補0。當(dāng)該數(shù)據(jù)的最為1(對于一般整型來說即為負(fù)數(shù)),則與使用的編譯系統(tǒng)有關(guān)。有的編譯系統(tǒng)將右移后左邊空出的部分補1,稱為“算術(shù)右移”;有的編譯 系統(tǒng)將右移后左邊空出的部分補0,稱為“邏輯右移”。 32
16、位編譯系統(tǒng)VS2008,屬于“算術(shù)右移”。513.3 程序舉例【例13-3】 編寫一個C程序,其功能是:從鍵盤輸入一個無符號整數(shù)m以及位移位數(shù)n,當(dāng)n0時,將m循環(huán)右移n位,當(dāng)n0時,將m循環(huán) |n|位。將一個無符號整數(shù)m循環(huán)移n位的方法如下:首先用sizeof( )函數(shù)確定一個無符號整數(shù)所占的二進制位數(shù)k。如果是循環(huán)右移,則先將m右移n位(即將原數(shù)的高k-n位移到低位),再將mk-n位(即將原數(shù)的低n位移到高位),然后將它們作按位或運算(即將它們合并)。如果是循環(huán),則先將mn位(即將原數(shù)的低k-n位移到),再將m右移k-n位(即將原數(shù)的高n位移到低位),然后將它們作按位或運算(即將它們合并)
17、。struct packed_x unsignedf1:2;unsignedf2:1;unsignedf3:2; n;非位段成員n在位段成員f1、f2與f3之后。但不管位段成員在兩個位段成員之間,或非位段成員在所有位段成員之后,非位段成員總是從下一個字節(jié)開始存放,當(dāng)前字節(jié)剩下的位空間不再使用。非位段成員的 方式與普通結(jié)構(gòu)體成員的 方式完全相同。(7) 位段結(jié)構(gòu)體類型變量中的位段成員可以在一般的表達式中被 ,并被自動轉(zhuǎn)換為相應(yīng)的整數(shù)。例如,下列賦值語句是合法的:p=x.f4 + 2*x.f2;(6) 在位段結(jié)構(gòu)類型定義中,可以包含非位段成員。例如, struct packed_xn;unsign
18、edf1:2;unsignedf2:1;unsignedf3:2;其中n為非位段成員,它單獨占4個字節(jié)。非位段成員也可以在兩個位段成員之間,例如,struct packed_x unsignedf1:2;n;unsignedf2:1;unsignedf3:2;非位段成員n在位段成員f1與f2之間。非位段成員也可以在所有位段成員之后,例如,(5) 不能用sizeof求段位成員的大小。例如,struct unsigned char a:3; unsigned char b:2; unsigned char c:3; byte;byte.a=07; byte.b=02; byte.c=06; siz
19、eof(byte.a);編譯時,會出現(xiàn)錯誤信息:error C2070: illegal sizeof operand每個位段(成員)所占的二進制位數(shù)一般過一個機器字長。位段不能說明為數(shù)組,也不能用指針指向位段成員。例如,struct unsigned char a:3; unsigned char b:2; unsigned char c:3; byte;byte.a=07; byte.b=02; byte.c=06; char *p; p=&byte.a;編譯時,會出現(xiàn)錯誤信息:error C2104: & on bit field ignoredstruct packed_data un
20、signed char f1:2; unsigned char f2:1; unsigned char :2; unsigned char f3:3;在這個位段結(jié)構(gòu)定義中的第3個位段(成員)是無名位段,它占有2個二進制位,在位段f2與f3之間起分隔(或占位)作用。無名位段所占用的空間不起作用。如果無名位段的寬度值為0,則表示下一個位段從一個新的字節(jié)開始存放。例如,struct packed_data unsigned char f1:2; unsigned char f2:1; unsigned char :0; unsigned char f3:3;這個位段結(jié)構(gòu)要占2個字節(jié)。6第二個執(zhí)行語句
21、pr f(sizeof x = %dn, sizeof x);是輸出項為位段結(jié)構(gòu)體類型變量的大小,x中位段a,b,c共9位,可以存放在一個unsigned short中,同非位段short成員 k,組成一個無符號的 型變量。因此輸出結(jié)果為sizeof x = 4 。第三個執(zhí)行語句pr f(%xn, x.k);是按整型格式說明符%x輸出構(gòu)體類型變量x中short型成員x.k的值,即輸出為a。第四個執(zhí)行語句pr f(sizeof x.k = %dn, sizeof x.k);是輸出項為位段結(jié)構(gòu)體類型變量的同非位段short成員k。因此輸出結(jié)果為sizeof x.k = 2 。在上述程序的位段結(jié)構(gòu)類
22、型中,定義了三個位段a,b,c, 以及非位段成員k,當(dāng)為位段結(jié)構(gòu)類型變量x中的各成員賦 值后,它們在計算機內(nèi)存中被分配的單元以及為各位 段賦值后的狀態(tài)如圖13.2所示(右邊為低位,左邊為)。位段空間的分配如下圖所示:第一個輸出語句pr f(%xn, x);中的格式說明符為整型格式說明符%x,而輸出項為位段結(jié)構(gòu)體類型變量(x是一個無符號的 型變量),其十進制值為 105,即十六進制值輸出為a0069?!纠?3-4】 設(shè)位#include 段的空間分配是從 struct packed_bit右到左的(即從低 unsigned short a:2;位到),下列C程序的輸出unsigned short b:3;結(jié)果:unsigne
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 養(yǎng)鵝回收合同范本
- sushe裝修合同范例
- 代開勞務(wù)合同范本
- 高校音樂廳的運營管理探究
- ktv公主合同范本
- 包棚銷售合同范本
- 產(chǎn)品交易居間合同范例
- 住宅賣房合同范本
- 對乙方有利租房合同范本
- 個體施工合同范本
- 2025屆山東省濱州市三校聯(lián)考語文高三第一學(xué)期期末質(zhì)量跟蹤監(jiān)視試題含解析
- 道路運輸企業(yè)主要負(fù)責(zé)人和安全生產(chǎn)管理人員安全考核題(公共部分題+專業(yè)部分題)及答案
- 4.2 歌曲《牧羊女》課件(14張)
- 2023電化學(xué)儲能電站消防安全標(biāo)準(zhǔn)鉛炭電池(鉛酸電池)
- 2024都市人群科學(xué)護肝白皮書-byhealthx庶正康訊x天貓-202409
- 2024至2030年中國天津市酒店行業(yè)市場發(fā)展現(xiàn)狀及投資方向研究報告
- 新教材-外研版高中英語選擇性必修第二冊全冊教學(xué)課件(按單元排序-)
- 甘肅省臨夏州2023-2024學(xué)年高二下學(xué)期期末質(zhì)量檢測語文試卷(無答案)
- 貨場煤泥合同模板
- 六年級《環(huán)境教育》計劃及教案設(shè)計
- 房產(chǎn)中介公司薪酬制度
評論
0/150
提交評論