版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、C語言允許對內(nèi)存中的字節(jié)或字節(jié)內(nèi)的二進(jìn)制位進(jìn)行運(yùn)算,即位運(yùn)算. 12.1 位運(yùn)算符和位運(yùn)算 位運(yùn)算符共6 種: a = a b ; b = b a ; a = a b ; printf ( “ %d , %d ” ,a , b ) ; 輸出: 4 , 3,00000011,00000000,00000100,00000000,00000111,00000000,a,b,a,00000011,00000000,b,00000100,00000000,a,12.1.3 “按位異或”運(yùn)算符() 作用: 對參加運(yùn)算的兩個二進(jìn)制數(shù)按位進(jìn)行邏輯異或運(yùn)算. 規(guī)則: 00 = 0, 10 = 1, 01 =
2、1, 11 = 0,結(jié)論: 利用異或運(yùn)算,不必設(shè)置第三個變量就可以實(shí)現(xiàn)兩個整型變量值的交換。,用途:某位“異或”1 要變,某位“異或”0 不變。 1) 使指定位翻轉(zhuǎn)。比如:要使一個字節(jié)的低四位翻轉(zhuǎn),只需異或0 x0f 。,00100011,a,00001111,a,0 x0f,00101100,2) 清零。一個整型(含字符型)數(shù)據(jù)“異或”自身,便清零.,00100011,a,a,00000000,00100011,a,12.1.4 “按位取反” 運(yùn)算符() 作用: 對一個二進(jìn)制數(shù)按位取反,是一個單目運(yùn)算符. 如: a = 15 則 a = 65520,00000000,00001111,111
3、11111,11110000,a, a,注意: 和! 運(yùn)算符是兩個完全不同的運(yùn)算符。 的優(yōu)先級與 + +, , !相同,且結(jié)合性都是從右至左。 例如:main ( ) int a = 0 , b = 1 ; printf ( “ %d , %d n”, a ,b ) ; printf ( “ %d , %d n”, !a , !b ) ; 運(yùn)行結(jié)果: 1, 2 1, 0,00000000,00000000,11111111,11111111,0, 0,應(yīng)用舉例: 若有一個整數(shù)a ,想使它最低一位為0(即屏蔽d0位),而其它位不變。請問如何操作?,方法是: a=a 嗎?,答:對于以16位存放一個
4、整型數(shù)據(jù)的計算機(jī)系統(tǒng),后者也是可以的。但對于以32位(或更多位)存放一個整型數(shù)據(jù)的系統(tǒng)(如VAX 11/780),后者是不可以的。因此,后者的可移植性很差;而前者則適合于任何系統(tǒng),程序的可移植性好!,16位整型,32位整型,12.1.5 左移位運(yùn)算 () 作用: 將操作數(shù)的各個二進(jìn)位順序左移,右端空出的位補(bǔ)0,而移出左端之外的位則丟失. 如: an 表示將a 的各個二進(jìn)位順序左移n 位(n 為正整數(shù)). 例如: a=25; 則 a3 的結(jié)果為200,00011001,00000000,11001000,00000000,a,a3,說明: (1) 對于無符號數(shù),左移1位,相當(dāng)于乘2 ;左移n 位
5、,則乘2n。但是此結(jié)論只適用于該數(shù)左移時被溢出的最高位中沒有1的情況。 (2) 對于用補(bǔ)碼表示的正數(shù),如果左移出的全部是0 , 且移出后的最高位仍為0 時,數(shù)據(jù)不會溢出。,(3) 對于用補(bǔ)碼表示的負(fù)數(shù),如果左移出的全部是1,且移出后的最高位仍為1 時,數(shù)據(jù)不會溢出。如:,11111110,11111111,11110000,11111111, 2,23,(4) 若非上面(2)、(3)所述情況,則數(shù)據(jù)左移后會產(chǎn)生溢出,那 就不能簡單地用乘2 來計算了。 如: 有符號字符型數(shù)據(jù)64 , 當(dāng)它左移2 位時,結(jié)果為0 .,00010000,00000000,按位取反加1 得:16,01000000,6
6、4,00000000,642,12.1.6 右移運(yùn)算符 () 作用: 將操作數(shù)的各個二進(jìn)位順序右移.左端空出的位補(bǔ)0 或補(bǔ)1,而移出右端的位則被舍去. 如: an 表示將a 的各個二進(jìn)位順序右移n 位. 說明: 右移運(yùn)算的結(jié)果與操作數(shù)的符號有關(guān). 就Turbo C2.0而言: 1) 無符號數(shù)為“邏輯右移”,即左端空出位一律補(bǔ)0 . 2) 有符號數(shù)為“算術(shù)右移”,即正數(shù)右移,空位補(bǔ)0 ,負(fù)數(shù)右移,空位補(bǔ)1 .一句話,算術(shù)右移是指最高位移入符號位。 其它系統(tǒng)對有符號數(shù)可能依然采用“邏輯右移”,這隨系統(tǒng)而定.,00000000,10000000,00000000,01000000,00000000,
7、11000000,a,a 1,a 1,邏輯右移,結(jié)果為 16384,算術(shù)右移,結(jié)果為 16384,算術(shù)右移運(yùn)算相當(dāng)于除2 運(yùn)算。 右移 1 位,相當(dāng)于除以2 。右移n 位,則除以2n 。,例如: a = 32768,12.1.7 位運(yùn)算符的優(yōu)先級與結(jié)合性 c = ( 0 n ); d = b ,00000000,11011001,00000000,00001101,a,d,1 0 0 0 1 0 0 1,右移 2 位,0 1 1 0 0 0 1 0,例12.2 將一個整數(shù)a 循環(huán)右移n 位。所謂循環(huán)右移是將a 最右端的位順序移到a 的最左端,而將a 中原左端的各位順序右移。,分析: (1) 將
8、a 左移16n 位并存入變量b 中(即用b存放未來的高位)。 b = a (16n),11011111,10101011,01100000,00000000,a,b,(3) 將 c 與 b 按位或運(yùn)算 c = c | b,(2) 將a 邏輯右移n 位。即原a中的左端16-n位右移了n位且被保留,而高n位變?yōu)?。 c = a n,00011011,11110101,c,01111011,11110101,c,main ( ) unsignde a , b , c ; int n ; scanf ( “ %o , %d ” , 如輸入: 157653 , 3 輸出為: 157653 75765 同
9、樣的方法,可以實(shí)現(xiàn)循環(huán)左移。,11011111,10101011,01111011,11110101,a,c,12.3 位 段,以前,我們內(nèi)存的存取都是以字節(jié)為單位,即信息存儲至少要占用一個字節(jié)。實(shí)際上,有時存儲一個信息不必占用一個或多個字節(jié),而只需占用1位或幾位便可。這在計算機(jī)過程控制和數(shù)據(jù)通信領(lǐng)域經(jīng)常會遇到。C語言提供對這方面的處理,而且可用以下兩種方法實(shí)現(xiàn):,1、通過位運(yùn)算實(shí)現(xiàn)對1位或幾位的操作:比如我們可以人為地將一個字節(jié)data劃分為幾項,假如是四項a、b、c、d,且它們分別占1位、3位、2位、2位(如下圖所示)。如果欲將b的值變?yōu)?,則可以這樣:,data,a,b,c,d,7,0,
10、(1)將b項(4 6位)清零 data = data ,(3)將data與“64”進(jìn)行按位或運(yùn)算,即可實(shí)現(xiàn)將b的值變?yōu)? 。,7,0,(2)將數(shù)6左移4位,使110成為4 - 6位,7,0,data,data,|(64),(74),說明:其中(1)步中的0 x8f,稱為“屏蔽字”,即把data中b的信息屏蔽掉,而其它信息不受影響。,2、通過位段來實(shí)現(xiàn)對1位或幾位的操作:C語言允許在一個結(jié)構(gòu)體中以位為單位來指定其成員所占內(nèi)存的長度,這種以位為單位的成員稱為“位段”(或“位域”bit field)。例如:,Struct packed_data unsigned a:2; unsigned b:6;
11、 unsigned c:4; unsigned d:4; int i; data;,Struct packed_data unsigned a:2; unsigned b:3; unsigned c:4; int i; ; Struct packed_data data;,a,b,c,空閑,i,16,7,4,3,2,7,0,15,23,31,關(guān)于位段的定義和引用的說明: 1)位段成員的類型必須指定為unsigned int型。 2)若某一位段要從另一存儲單元(字)單獨(dú)開始存放,應(yīng)這樣定義:,Struct packed_data unsigned a:1; unsigned b:2; unsig
12、ned :0; unsigned c:3; /* 在Turbo C中表示c從第3個字節(jié)開始存放 */ ;,3)可以定義無名字段,如:,Struct packed_data unsigned a:1; unsigned :2; /* 表示這兩位空間不用 */ unsigned b:3; unsigned c:4; ;,4) 一個位段必須存儲在同一存儲單元(字)中,不能跨越兩個單元。如果第一個字不能容納下一個位段,則該空間不用,而從下一個字開始存放。比如:,Struct packed_data unsigned a:5; unsigned b:6; unsigned c:6; int i; ; Struct packed_data data;,16,6,5,6,5,注意:上面定義的結(jié)構(gòu)體共占6個字節(jié)
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026云南西雙版納州勐海縣城鄉(xiāng)居民社會養(yǎng)老保險中心招聘城鎮(zhèn)公益性崗位人員2人備考題庫及答案詳解(易錯題)
- 2026內(nèi)蒙古民族大學(xué)招聘銀齡教師17人備考題庫參考答案詳解
- 2025河南許昌市規(guī)劃展覽館招聘講解員3人備考題庫及一套參考答案詳解
- 2026浙商銀行資金營運(yùn)中心社會招聘備考題庫及1套完整答案詳解
- 2025中國農(nóng)業(yè)大學(xué)鄧愛華教授誠聘博士后備考題庫及答案詳解(奪冠系列)
- 2026中聞印務(wù)投資集團(tuán)有限公司財務(wù)經(jīng)理招聘1人備考題庫及答案詳解(新)
- 2026浙江嘉興南洋職業(yè)技術(shù)學(xué)院教職人員招聘12人備考題庫及答案詳解(新)
- 2026年陜西師范大學(xué)少數(shù)民族學(xué)生專職輔導(dǎo)員招聘備考題庫及答案詳解一套
- 2025甘肅蘭州新區(qū)石化產(chǎn)業(yè)投資集團(tuán)有限公司法務(wù)專干、造價工程師、會計崗位招聘6人備考題庫帶答案詳解
- 2026山東德州市國企外包崗位工作人員招聘備考題庫及答案詳解(奪冠系列)
- 不良資產(chǎn)合作戰(zhàn)略框架協(xié)議文本
- 2025年鹽城中考?xì)v史試卷及答案
- 2025年六年級上冊道德與法治期末測試卷附答案(完整版)
- IPC7711C7721C-2017(CN)電子組件的返工修改和維修(完整版)
- 新能源的發(fā)展與城市能源轉(zhuǎn)型與升級
- 《醫(yī)務(wù)人員醫(yī)德規(guī)范》課件
- 兒童吸入性肺炎護(hù)理查房課件
- 生理學(xué)期中考試試題及答案
- 呂國泰《電子技術(shù)》
- 哈薩克族主要部落及其歷史
- 2015比賽練習(xí)任務(wù)指導(dǎo)書
評論
0/150
提交評論