




已閱讀5頁,還剩15頁未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
按位與運(yùn)算 按位與運(yùn)算符&是雙目運(yùn)算符。其功能是參與運(yùn)算的兩數(shù)各對應(yīng)的二進(jìn)位相與。只有對應(yīng)的兩個(gè)二進(jìn)位均為1時(shí),結(jié)果位才為1 ,否則為0。參與運(yùn)算的數(shù)以補(bǔ)碼方式出現(xiàn)。 例如:9&5可寫算式如下: 00001001 (9的二進(jìn)制補(bǔ)碼)&00000101 (5的二進(jìn)制補(bǔ)碼) 00000001 (1的二進(jìn)制補(bǔ)碼)可見9&5=1。 按位與運(yùn)算通常用來對某些位清0或保留某些位。例如把a(bǔ) 的高八位清 0 , 保留低八位, 可作 a&255 運(yùn)算 ( 255 的二進(jìn)制數(shù)為0000000011111111)。 應(yīng)用: a. 清零特定位 (mask中特定位置0,其它位為1,s=s&mask) b. 取某數(shù)中指定位 (mask中特定位置1,其它位為0,s=s&mask) 2. 按位或運(yùn)算 按位或運(yùn)算符“|”是雙目運(yùn)算符。其功能是參與運(yùn)算的兩數(shù)各對應(yīng)的二進(jìn)位相或。只要對應(yīng)的二個(gè)二進(jìn)位有一個(gè)為1時(shí),結(jié)果位就為1。參與運(yùn)算的兩個(gè)數(shù)均以補(bǔ)碼出現(xiàn)。 例如:9|5可寫算式如下: 00001001|00000101 00001101 (十進(jìn)制為13)可見9|5=13 應(yīng)用: 常用來將源操作數(shù)某些位置1,其它位不變。 (mask中特定位置1,其它位為0 s=s|mask) 3. 按位異或運(yùn)算 按位異或運(yùn)算符“”是雙目運(yùn)算符。其功能是參與運(yùn)算的兩數(shù)各對應(yīng)的二進(jìn)位相異或,當(dāng)兩對應(yīng)的二進(jìn)位相異時(shí),結(jié)果為1。參與運(yùn)算數(shù)仍以補(bǔ)碼出現(xiàn),例如95可寫成算式如下: 0000100100000101 00001100 (十進(jìn)制為12) 應(yīng)用: a. 使特定位的值取反 (mask中特定位置1,其它位為0 s=smask) b. 不引入第三變量,交換兩個(gè)變量的值 (設(shè) a=a1,b=b1) 目 標(biāo) 操 作 操作后狀態(tài) a=a1b1 a=ab a=a1b1,b=b1 b=a1b1b1 b=ab a=a1b1,b=a1 a=b1a1a1 a=ab a=b1,b=a1 4. 求反運(yùn)算 求反運(yùn)算符為單目運(yùn)算符,具有右結(jié)合性。 其功能是對參與運(yùn)算的數(shù)的各二進(jìn)位按位求反。例如9的運(yùn)算為: (0000000000001001)結(jié)果為:1111111111110110 5. 左移運(yùn)算 左移運(yùn)算符“”是雙目運(yùn)算符。其功能把“ ”左邊的運(yùn)算數(shù)的各二進(jìn)位全部左移若干位,由“”右邊的數(shù)指定移動(dòng)的位數(shù), 高位丟棄,低位補(bǔ)0。 其值相當(dāng)于乘2。例如: a”是雙目運(yùn)算符。其功能是把“ ”左邊的運(yùn)算數(shù)的各二進(jìn)位全部右移若干位,“”右邊的數(shù)指定移動(dòng)的位數(shù)。其值相當(dāng)于除2。 例如:設(shè) a=15,a2 表示把000001111右移為00000011(十進(jìn)制3)。對于左邊移出的空位,如果是正數(shù)則空位補(bǔ)0,若為負(fù)數(shù),可能補(bǔ)0或補(bǔ)1,這取決于所用的計(jì)算機(jī)系統(tǒng)。移入0的叫邏輯右移,移入1的叫算術(shù)右移,Turbo C采用邏輯右移。main() unsigned a,b; printf(input a number: ); scanf(%d,&a); b=a5; b=b&15; printf(a=%d b=%d ,a,b); 再看一例:main() char a=a,b=b; int p,c,d; p=a; p=(p8; printf(a=%d b=%d c=%d d=%d ,a,b,c,d); 浮點(diǎn)數(shù)的存儲(chǔ)格式: 浮點(diǎn)數(shù)的存儲(chǔ)格式是符號(hào)+階碼(定點(diǎn)整數(shù))+尾數(shù)(定點(diǎn)小數(shù))SEEEEEEEEMMMMMMMMMMMMMMMMMMMMMMM即1位符號(hào)位(0為正,1為負(fù)),8位指數(shù)位,23位尾數(shù)位浮點(diǎn)數(shù)存儲(chǔ)前先轉(zhuǎn)化成2的k次方形式,即:f = A1*2k + A2*2(k-1) + . + Ak +. +An*2(-m) (Ai = 0, 1, A1 = 1)如5.5=22 + 20 + 2(-1)其中的k就是指數(shù),加127后組成8位指數(shù)位5.5的指數(shù)位就是2+127 = 129 = 10000001A2A3.An就是尾數(shù)位,不足23位后補(bǔ)0所以5.5 = 01000000101000000000000000000000 = 40A00000所以,對浮點(diǎn)數(shù)*2、/2只要對8位符號(hào)位+、- 即可,但不是左移、右移 關(guān)于unsigned int 和 int 的在位運(yùn)算上的不同,下面有個(gè)CU上的例子描述的很清楚: 問題:這個(gè)函數(shù)有什么問題嗎?/* 本函數(shù)將兩個(gè)16比特位的值連結(jié)成為一個(gè)32比特位的值。* 參數(shù):sHighBits 高16位* sLowBits 低16位* 返回:32位值*/long CatenateBits16(short sHighBits, short sLowBits)long lResult = 0; /* 32位值的臨時(shí)變量*/* 將第一個(gè)16位值放入32位值的高16位 */lResult = sHighBits;lResult = 16;/* 清除32位值的低16位 */lResult &= 0xFFFF0000;/* 將第二個(gè)16位值放入32位值的低16位 */lResult |= (long)sLowBits;return lResult;/問題的發(fā)現(xiàn):我們先看如下測試代碼:/int main()short sHighBits1 = 0x7fff;short sHighBits2 = 0x8f12;unsigned short usHighBits3 = 0xff12;short sLowBits1 = 0x7bcd; long lResult = 0;printf(sHighBits1 + sLowBits1 ;lResult = CatenateBits16(sHighBits1, sLowBits1);printf(lResult = %08x , lResult, lResult);lResult = CatenateBits16(sHighBits2, sLowBits1);printf(lResult = %08x , lResult, lResult);lResult = CatenateBits16(usHighBits3, sLowBits1);printf(lResult = %08x , lResult, lResult); /運(yùn)行結(jié)果為:sHighBits1 + sLowBits1lResult = 7fff7bcdlResult = 8f127bcdlResult = ff127bcd嗯,運(yùn)行很正確嘛于是我們就放心的在自己的程序中使用起這個(gè)函數(shù)來了。可是忽然有一天,我們的一個(gè)程序無論如何結(jié)果都不對!經(jīng)過n個(gè)小時(shí)的檢查和調(diào)試,最后終于追蹤到CatenateBits16() ???它的返回值居然是錯(cuò)的!“郁悶!”你說,“這個(gè)函數(shù)怎么會(huì)有問題呢!?”可是,更郁悶的還在后頭呢,因?yàn)槟惆殉绦蛑械妮斎肓孔鳛閰?shù),在一個(gè)簡單的main()里面單步調(diào)試:/int main()short sHighBits1 = 0x7FFF;short sHighBits2 = 0x8F12;unsigned short usHighBits3 = 0x8F12;short sLowBits1 = 0x7BCD; /你實(shí)際使用的參數(shù)short sLowBits2 = 0x8BCD; /你實(shí)際使用的參數(shù)long lResult = 0;printf(sHighBits1 + sLowBits1 ;lResult = CatenateBits16(sHighBits1, sLowBits1);printf(lResult = %08x , lResult, lResult);lResult = CatenateBits16(sHighBits2, sLowBits1);printf(lResult = %08x , lResult, lResult);lResult = CatenateBits16(usHighBits3, sLowBits1);printf(lResult = %08x , lResult, lResult); printf( sHighBits1 + sLowBits2 ;lResult = CatenateBits16(sHighBits1, sLowBits2);printf(lResult = %08x , lResult, lResult);lResult = CatenateBits16(sHighBits2, sLowBits2);printf(lResult = %08x , lResult, lResult);lResult = CatenateBits16(usHighBits3, sLowBits2);printf(lResult = %08x , lResult, lResult);return 0;/發(fā)現(xiàn)結(jié)果竟然是:sHighBits1 + sLowBits1lResult = 7fff7bcdlResult = 8f127bcdlResult = 8f127bcdsHighBits1 + sLowBits2lResult = ffff8bcd /oops!lResult = ffff8bcd /oops!lResult = ffff8bcd /oops!前一次還好好的,后一次就ffff了?X檔案?X檔案的真相:注意那兩個(gè)我們用來當(dāng)作低16位值的sLowBits1和sLowBits2。已知:使用 sLowBits1 = 0x7bcd 時(shí),函數(shù)返回正確的值;使用 sLowBits2 = 0x8bcd 時(shí),函數(shù)中發(fā)生X檔案。那么,sLowBits1與sLowBits2有什么區(qū)別?注意了,sLowBits1和sLowBits2都是short型(而不是unsigned short),所以在這里,sLowBits1代表一個(gè)正數(shù)值,而sLowBits2卻代表了一個(gè)負(fù)數(shù)值(因?yàn)?即是二進(jìn)制1000,sLowBits2最高位是1)。再看CatenateBits16()函數(shù):/long CatenateBits16(short sHighBits, short sLowBits)long lResult = 0; /* 32位值的臨時(shí)變量*/* 將第一個(gè)16位值放入32位值的高16位 */lResult = sHighBits;lResult = 16;/* 清除32位值的低16位 */lResult &= 0xFFFF0000;/* 將第二個(gè)16位值放入32位值的低16位 */lResult |= (long)sLowBits; /注意這一句!return lResult;/如果我們在函數(shù)中用printf(sLowBits = %04x , sLowBits);打印傳入的sLowBits值,會(huì)發(fā)現(xiàn)sLowBits = 0x7bcd 時(shí),打印結(jié)果為sLowBits = 7bcd而sLowBits = 0x8bcd時(shí),打印結(jié)果為sLowBits = ffff8bcd是的,即使用%04x也打印出8位十六進(jìn)制。因此,我們看出來了:當(dāng)sLowBits = 0x8bcd時(shí),函數(shù)中 lResult |= (long)sLowBits; 這一句執(zhí)行,會(huì)先將sLowBits轉(zhuǎn)換為0xffff8bcd再與lResult做或運(yùn)算。由于現(xiàn)在lResult的值為 0xXXXX0000 (其中XXXX是任何值),所以顯然,無論sHighBits是什么值,最后結(jié)果都會(huì)是0xffff8bcd而當(dāng)sLowBits = 0x7bcd時(shí),函數(shù)中 lResult |= (long)sLowBits; 這一句執(zhí)行,會(huì)先將sLowBits轉(zhuǎn)換為0x00007bcd再與lResult做或運(yùn)算。這樣做或運(yùn)算出來的結(jié)果當(dāng)然就是對的。也就是說,CatenateBits16()在sLowBits的最高位為0的時(shí)候表現(xiàn)正常,而在最高位為1的時(shí)候出現(xiàn)偏差。教訓(xùn):在某些情況下作位運(yùn)算和位處理的時(shí)候,考慮使用無符號(hào)數(shù)值因?yàn)檫@個(gè)時(shí)候往往不需要處理符號(hào)。即使你需要的有符號(hào)的數(shù)值,那么也應(yīng)該考慮自行在調(diào)用CatenateBits16()前后做轉(zhuǎn)換畢竟在位處理中,有符號(hào)數(shù)值相當(dāng)詭異!下面這個(gè)CatenateBits16()版本應(yīng)該會(huì)好一些:/unsigned long CatenateBits16(unsigned short sHighBits, unsigned short sLowBits)long lResult = 0;/* 將第一個(gè)16位值放入32位值的高16位 */lResult = sHighBits;lResult = 16;/* 清除32位值的低16位 */lResult &= 0xFFFF0000;/* 將第二個(gè)16位值放入
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(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ǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025-2026學(xué)年江蘇省蘇州市常熟市三年級數(shù)學(xué)第一學(xué)期期末學(xué)業(yè)水平測試試題含解析
- 2024年宜昌市枝江市三年級數(shù)學(xué)第一學(xué)期期末達(dá)標(biāo)檢測模擬試題含解析
- 2024年龍南縣三上數(shù)學(xué)期末達(dá)標(biāo)檢測試題含解析
- 分析化學(xué)考試總復(fù)習(xí)課件
- 2025年衛(wèi)生資格考試重點(diǎn)復(fù)習(xí)試題及答案
- 2025年衛(wèi)生資格考試核心知識(shí)點(diǎn)及試題與答案
- 行政管理??圃囶}與答案的重點(diǎn)關(guān)聯(lián)
- 行政管理的全球化趨勢及試題及答案
- 2025年經(jīng)濟(jì)法考試經(jīng)驗(yàn)分享試題及答案
- 執(zhí)業(yè)藥師行業(yè)規(guī)范及試題及答案
- (完整版)醫(yī)療器械網(wǎng)絡(luò)交易服務(wù)第三方平臺(tái)質(zhì)量管理文件
- 中國動(dòng)漫發(fā)展史課件
- 【履職清單】2023新版安全生產(chǎn)責(zé)任體系重點(diǎn)崗位履職清單
- 門式起重機(jī)、架橋機(jī)作業(yè)前安全隱患排查表
- 安全閥在線校驗(yàn)及延期校驗(yàn)
- GB/T 19670-2023機(jī)械安全防止意外啟動(dòng)
- GB/T 9128.1-2023鋼制管法蘭用金屬環(huán)墊第1部分:PN系列
- 幼兒園新生入園報(bào)名登記表
- 中國臨床戒煙指南的指導(dǎo)意義
- (完整版)EORTC生命質(zhì)量測定量表QLQ-C30(V3.0)
- 醫(yī)院醫(yī)學(xué)影像科CT-MR室診療指南和操作規(guī)范2022版
評論
0/150
提交評論