位操作運(yùn)算符_第1頁(yè)
位操作運(yùn)算符_第2頁(yè)
位操作運(yùn)算符_第3頁(yè)
位操作運(yùn)算符_第4頁(yè)
位操作運(yùn)算符_第5頁(yè)
免費(fèi)預(yù)覽已結(jié)束,剩余3頁(yè)可下載查看

下載本文檔

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

文檔簡(jiǎn)介

1、按位與運(yùn)算按位與運(yùn)算符&是雙目運(yùn)算符。其功能是參與運(yùn)算的兩數(shù)各對(duì)應(yīng)的二進(jìn)位相與。只有對(duì)應(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)算通常用來(lái)對(duì)某些位清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&ma

2、sk)2 .按位或運(yùn)算按位或運(yùn)算符“|”是雙目運(yùn)算符。其功能是參與運(yùn)算的兩數(shù)各對(duì)應(yīng)的二進(jìn)位相或。只要對(duì)應(yīng)的二個(gè)二進(jìn)位有一個(gè)為1時(shí),結(jié)果位就為1。參與運(yùn)算的兩個(gè)數(shù)均以補(bǔ)碼出現(xiàn)。例如:9|5可寫算式如下:00001001|0000010100001101(十進(jìn)制為13)可見9|5=13應(yīng)用:常用來(lái)將源操作數(shù)某些位置1,其它位不變。(mask中特定位置1,其它位為0s=s|mask)3 .按位異或運(yùn)算按位異或運(yùn)算符“人”是雙目運(yùn)算符。其功能是參與運(yùn)算的兩數(shù)各對(duì)應(yīng)的二進(jìn)位相異或,當(dāng)兩對(duì)應(yīng)的二進(jìn)位相異時(shí),結(jié)果為1。參與運(yùn)算數(shù)仍以補(bǔ)碼出現(xiàn),例如9A5可寫成算式如下:00001001A00000101000

3、01100(十進(jìn)制為12)應(yīng)用:a.使特定位的值取反(mask中特定位置b.不引入第三變量,交換兩個(gè)變量的值1,其它位為0s=sAmask)(設(shè)a=a1,b=b1)目標(biāo)操作操作后狀態(tài)a=a1Ab1a=aAba=a1Ab1,b=b1b=a1Ab1Ab1b=aAba=a1Ab1,b=a1a=b1Aa1Aa1a=aAba=b1,b=a14 .求反運(yùn)算求反運(yùn)算符為單目運(yùn)算符,具有右結(jié)合性。其功能是對(duì)參與運(yùn)算的數(shù)的各二進(jìn)位按位求反。例如9的運(yùn)算為:(0000000000001001)結(jié)果為:11111111111101105 .左移運(yùn)算左移運(yùn)算符“”是雙目運(yùn)算符。其功能把“”左邊的運(yùn)算數(shù)的各二進(jìn)位全部左

4、移若干位,由“”右邊的數(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)。對(duì)于左邊移出的空位,如果是正數(shù)則空位補(bǔ)0,若為負(fù)數(shù),可能補(bǔ)0或補(bǔ)1,這取決于所用的計(jì)算機(jī)系統(tǒng)。移入0的叫邏輯右移,移入1的叫算術(shù)右移,TurboC采用邏輯右移。main()unsigneda,b;printf(inputanumber:);scanf(%d,&a);b=a5;b=b&15;printf(a=%db=%d,

5、a,b);)再看一例:main()chara=a,b=b;intp,c,d;p=a;p=(p8;printf(a=%db=%dc=%dd=%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*2Ak+A2*2A(k-1)+.+Ak+.+An*2A(-m)(Ai=0,1,A1=1)如5.5=2A2+2A0+2A(-1)其中的k就是指數(shù),加127后組成8位指數(shù)位5.5的指數(shù)位就是2+

6、127=129=10000001A2A3.An就是尾數(shù)位,不足23位后補(bǔ)0所以5.5=01000000101000000000000000000000=40A00000所以,對(duì)浮點(diǎn)數(shù)*2、/2只要對(duì)8位符號(hào)位+、-即可,但不是左移、右移關(guān)于unsignedint和int的在位運(yùn)算上的不同,下面有個(gè)CU上的例子描述的很清楚:問題:這個(gè)函數(shù)有什么問題嗎?/* 本函數(shù)將兩個(gè)16比特位的值連結(jié)成為一個(gè)32比特位的值。* 參數(shù):sHighBits高16位* sLowBits低16位*返回:32位值*/longCatenateBits16(shortsHighBits,shortsLowBits)long

7、IResult=0;/*32位值的臨時(shí)變量*/*將第一個(gè)16位值放入32位值白高16位*/IResult=sHighBits;IResult=16;/*清除32位值白低16位*/lResult&=0xFFFF0000;/*將第二個(gè)16位值放入32位值白低16位*/lResult|=(long)sLowBits;returnlResult;/問題的發(fā)現(xiàn):我們先看如下測(cè)試代碼:/intmain()(shortsHighBitsI=0x7fff;shortsHighBits2=0x8f12;unsignedshortusHighBits3=0xff12;shortsLowBits1=0x7bcd;l

8、onglResult=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é)果為:sHig

9、hBits1+sLowBits1lResult=7fff7bcdlResult=8f127bcdlResult=ff127bcd嗯,運(yùn)行很正確嘛,于是我們就放心的在自己的程序中使用起這個(gè)函數(shù)來(lái)了??墒呛鋈挥幸惶欤覀兊囊粋€(gè)程序無(wú)論如何結(jié)果都不對(duì)!經(jīng)過n個(gè)小時(shí)的檢查和調(diào)試,最后終于追蹤到,CatenateBits16()!?它的返回值居然是錯(cuò)的!“郁悶!”你說(shuō),“這個(gè)函數(shù)怎么會(huì)有問題呢???”可是,更郁悶的還在后頭呢,因?yàn)槟惆殉绦蛑械妮斎肓孔鳛閰?shù),在一個(gè)簡(jiǎn)單的main()里面單步調(diào)試:/intmain()(shortsHighBitsI=0x7FFF;shortsHighBits2=0x8F12

10、;unsignedshortusHighBits3=0x8F12;shortsLowBits1=0x7BCD;/你實(shí)際使用的參數(shù)shortsLowBits2=0x8BCD;/你實(shí)際使用的參數(shù)longlResult=0;printf(sHighBits1+sLowBits1;lResult=CatenateBits16(sHighBits1,sLowBits1);printf(lResult=%08x,lResult,lResult);lResult=CatenateBits16(sHighBits2,sLowBits1);printf(lResult=%08x,lResult,lResult)

11、;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(u

12、sHighBits3,sLowBits2);printf(lResult=%08x,lResult,lResult);return0;/發(fā)現(xiàn)結(jié)果竟然是:sHighBits1+sLowBits1lResult=7fff7bcdlResult=8f127bcdIResult=8f127bcdsHighBitsI+sLowBits2IResult=ffff8bcd/oops!lResult=ffff8bcd/oops!lResult=ffff8bcd/oops!ffff了?X檔案?前一次還好好的,后一次就X檔案的真相:注意那兩個(gè)我們用來(lái)當(dāng)作低16位值的sLowBits1和sLowBits2。已知:使

13、用sLowBits1=0x7bcd時(shí),函數(shù)返回正確的值;使用sLowBits2=0x8bcd時(shí),函數(shù)中發(fā)生X檔案。那么,sLowBits1與sLowBits2有什么區(qū)別?注意了,sLowBits1和sLowBits2都是short型(而不是unsignedshort),所以在這里,sLowBits1代表一個(gè)正數(shù)值,而sLowBits2卻代表了一個(gè)負(fù)數(shù)值(因?yàn)?即是二進(jìn)制1000,sLowBits2最高位是1)。再看CatenateBits16()函數(shù):/longCatenateBits16(shortsHighBits,shortsLowBits)longlResult=0;/*32位值的臨時(shí)

14、變量*/*將第一個(gè)16位值放入32位值白高16位*/lResult=sHighBits;lResult=16;/*清除32位值白低16位*/lResult&=0xFFFF0000;/*將第二個(gè)16位值放入32位值白低16位*/lResult|=(long)sLowBits;/注意這一句!!returnlResult;/如果我們?cè)诤瘮?shù)中用printf(sLowBits=%04x,sLowBits);打印傳入的sLowBits值,會(huì)發(fā)現(xiàn)sLowBits=0x7bcd時(shí),打印結(jié)果為sLowBits=7bcd而sLowBits=0x8bcd時(shí),打印結(jié)果為sLowBits=ffff8bcd是的,即使用0

15、4x也打印出8位十六進(jìn)制。因此,我們看出來(lái)了:當(dāng)sLowBits=0x8bcd時(shí),函數(shù)中l(wèi)Result|=(long)sLowBits;這一句執(zhí)行,會(huì)先將sLowBits轉(zhuǎn)換為0xffff8bcd再與lResult做或運(yùn)算。由于現(xiàn)在lResult的值為0xXXXX0000(其中XXXX是任何值),所以顯然,無(wú)論sHighBits是什么值,最后結(jié)果都會(huì)是0xffff8bcd而當(dāng)sLowBits=0x7bcd時(shí),函數(shù)中l(wèi)Result|=(long)sLowBits;這一句執(zhí)行,會(huì)先將sLowBits轉(zhuǎn)換為0x00007bcd再與lResult做或運(yùn)算。這樣做或運(yùn)算出來(lái)的結(jié)果當(dāng)然就是對(duì)的。也就是說(shuō),

16、CatenateBits16()在sLowBits的最高位為0的時(shí)候表現(xiàn)正常,而在最高位為1的時(shí)候出現(xiàn)偏差。教訓(xùn):在某些情況下作位運(yùn)算和位處理的時(shí)候,考慮使用無(wú)符號(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ì)好一些:/unsignedlongCatenateBits16(unsignedshortsHighBits,unsignedshortsLowBits)(longlResult=0;/*將第一個(gè)16位值放入32位值白高16位*/lResult=sHighBits;lResult=16;/*清除32位值白低16位*/lResult&=0xFFFF000

溫馨提示

  • 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ù)覽,若沒有圖紙預(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論