版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、單片機(jī)的C語(yǔ)言中位操作用法作者:郭天祥來(lái)源:轉(zhuǎn)自更新時(shí)問(wèn):2008-12-4 21:50:22瀏覽次數(shù):3123在對(duì)單處機(jī)進(jìn)行編程的過(guò)程中,對(duì)位的操作是經(jīng)常遇到的。C51對(duì)位的操控能力是非常強(qiáng)大的。從這一點(diǎn)上,就可以看出C不光具有高級(jí)語(yǔ)言的靈活性,又有低級(jí)語(yǔ)言匙近硬件的特點(diǎn)。這也是在各個(gè)領(lǐng)域中都可以看到C的重要原因。在這一節(jié)中將詳細(xì)講解C51中的位操 作及其應(yīng)用。1、位運(yùn)算符C51提供了幾種位操作符,如下表所示:運(yùn)算符含義運(yùn)算符含義&按位與取反按位或左移按位異或右移1) “按位與”運(yùn)算符(&)參加運(yùn)算的兩個(gè)數(shù)據(jù),按二進(jìn)位進(jìn)行“與”運(yùn)算。原則是全1為1, 有0為0,即:0&0二0; 0&1=0;
2、 1&0二0; 1&1=1;如下例:a=5&3; /a=(Ob 0101) & (Ob 0011) =0b 0001 =1那么如果參加運(yùn)算的兩個(gè)數(shù)為負(fù)數(shù),又該如何算呢?會(huì)以其補(bǔ)碼形 式表示的二進(jìn)制數(shù)來(lái)進(jìn)行與運(yùn)算。a=-5&-3; /a=(0b 1011) & (Obi101) =0b 1001 =-7在實(shí)際的應(yīng)用中與操作經(jīng)常被用于實(shí)現(xiàn)特定的功能:1. 清零“按位與”通常被用來(lái)使變量中的某一位清零。如下例:a=0xfe; /a=0b 11111110a=a&0x55;/使變量a的第1位、第3位、第5位、第7位清零a= Ob010101002. 檢測(cè)位要知道一個(gè)變量中某一位是T還是0,可以使用與操
3、作來(lái)實(shí)現(xiàn)。a=0xf5; /a=0b 11110101result=a&0x08; 檢測(cè) a 的第三位,result=03保留變量的某一位要屏蔽某一個(gè)變量的其它位,而保留某些位,也可以使用與操作來(lái)實(shí)現(xiàn)。a=0x55; /a=0b 01010101a=a&0x0f; 將高四位清零,而保留低四位a=0x052) “按位或”運(yùn)算符(I )參與或操作的兩個(gè)位,只要有一個(gè)為1,,則結(jié)果為1,。 即有1為1,全0為,0 o0|0=0; 0|1=1; 1|0=1; 111=1;例如:a=0x30|0x0f;/a=(0b00110000)|(ObOOOOl111)=(0b00111111)=0x3f按位或”運(yùn)
4、算最普遍的應(yīng)用就是對(duì)一個(gè)變量的某些位置T。如下例:a=0x00; /a=0b 00000000a=a|0x7f; 將 a 的低 7 位置為 l,a=0x7f3) “異或”運(yùn)算符(八)異或運(yùn)算符八又被稱為XOR運(yùn)算符。當(dāng)參與運(yùn)算的兩個(gè)位相同(T與1或0與0)時(shí)結(jié)果為0。不同時(shí)為1。 即相同為0,不同為1。0*0=0; o_i=i; 1*0=1;r1=0;例如:a=0x550x3f;/a=(0b01010101)(0b00111111)=(0b01101010)=0x6a異或運(yùn)算主要有以下幾種應(yīng)用:1.翻轉(zhuǎn)某一位當(dāng)一個(gè)位與1作異或運(yùn)算時(shí)結(jié)果就為此位翻轉(zhuǎn)后的值。如下例:a=0x35; /a=ObOO
5、110101a=a0x0f; /a=0b00111010 a 的低四位翻轉(zhuǎn)關(guān)于異或的這一作用,有一個(gè)典型的應(yīng)用,即取浮點(diǎn)的 相反數(shù),具體的實(shí)現(xiàn)如下:f=1.23; /f為浮點(diǎn)型變量 值為123f=f*-l; f乘以-1,實(shí)現(xiàn)取其相反數(shù),要進(jìn)行一次乘運(yùn) 算f=1.23;(unsigned char *)&f) 0=0x80; 將浮點(diǎn)數(shù) f 的符號(hào) 位進(jìn)行翻轉(zhuǎn)實(shí)現(xiàn)取相 反數(shù)2. 保留原值當(dāng)一個(gè)位與0作異或運(yùn)算時(shí),結(jié)果就為此位的值。如下 例:a=Oxff; /a=Oblllllllla=aOxOf; /a=ObllllOOOO 與 OxOf 作異或,高四位不變,低四位稀轉(zhuǎn)3. 交換兩個(gè)變量的值,而不
6、用臨時(shí)變量要交換兩個(gè)變量的值,傳統(tǒng)的方法都需要一個(gè)臨時(shí)變量。實(shí) 現(xiàn)如下:void swap(unsigned char *pa,unsigned char *pb)|unsigned char temp=*pa;/定義臨時(shí)變量,將pa指向的 變量值賦給它pa=*pb;pb=temp; 變量值對(duì)調(diào)|而使用異或的方法來(lái)實(shí)現(xiàn),就可以不用臨時(shí)變量,如下:void swap xor(unsigned char *pa,unsigned char *pb) pa=*papb;/檢查不同位,并置位1相同為置位0 置位1的位表示不同需要交換,置位0的位相同保留 pb=*papb; /反轉(zhuǎn)不同位pa=*papb
7、; 采用異或?qū)崿F(xiàn)變量對(duì)調(diào)|從上例中可以看到異或運(yùn)算在開(kāi)發(fā)中是非常實(shí)用和神奇的。4)取反”運(yùn)算符()與其它運(yùn)算符不同,“取反”運(yùn)算符為單目運(yùn)算符,即 它的操作數(shù)只有一個(gè)。它的功能就是對(duì)操作數(shù)按位取反。也 就是是T得0,是0得1 o1=0; 0=1;如下例:a=0xff; /a=0blllllllla=a; /a=0b000000001.對(duì)小于0的有符號(hào)整型變量取相反數(shù)d=-l;d為有符號(hào)整型變量,賦值為-1,存表示為Ob 11111111 11111111d=d+l; 取d的相反數(shù),d=l,存表示Ob 0000000000000001此例運(yùn)用了負(fù)整型數(shù)在存以補(bǔ)碼方式來(lái)存儲(chǔ)的這一原理來(lái)實(shí)現(xiàn)的。負(fù)數(shù)
8、 的補(bǔ)碼方式是這樣的:負(fù)數(shù)的絕對(duì)值的存表示取反加1,就 為此負(fù)數(shù)的存表示。如-23如果為八位有符號(hào)整型數(shù),則其 絕對(duì)值23的存表示為0bOOOlOlll,對(duì)其取反則為 OblllOlOOO,再加 1 為 OblllOlOOl,即為 0XE9,與 Keil 仿真結(jié)果是相吻合的:2.增強(qiáng)可移植性關(guān)于“增強(qiáng)可移植性用以下實(shí)例來(lái)講解:假如在一種單片機(jī)中unsigned char類型是八個(gè)位(1 個(gè)字節(jié)),那么一個(gè)此類型的變量a=0x67,對(duì)其最低位清 零。則可以用以下方法:a=0x67; /a=Ob 0110 0111a=a&0xfe; /a=0b 0110 0110上面的程序似乎沒(méi)有什么問(wèn)題,使用O
9、xfe這一因子就可以實(shí)現(xiàn)一個(gè) unsigned char型的變量最低位清零。但如果在另一種單 片機(jī)中的unsigned char類型被定義為16個(gè)位(兩個(gè)字 節(jié)),那么這種方法就會(huì)出錯(cuò),如下:b=0x6767; 假設(shè)b為另一種單片機(jī)中的unsigned char 類型變量,值為 Ob 0110 0111 0110 0111 b=b&Oxfe; 如果此時(shí)因子仍為Oxfe的話,則結(jié)果就為Ob 0000 0000 0110 0110 即 0x0066,而與 0x6766不相吻合上例中的問(wèn)題就是因?yàn)椴煌h(huán)境中的數(shù)據(jù)類型差異所造成的,即程序的可移 植性不好。對(duì)于這種情況可以采用如下方法來(lái)解決: a=0x
10、67; /a=0b 0110 0111a=a&l; 在不同的環(huán)境中將自動(dòng)匹配運(yùn)算因子,實(shí)現(xiàn) 最后一位清零a=0x66其中1為Ob iminob=0x6767; /a=0b 0110 0111 0110 0111b=al; l=0b 1111 1111 1111 1110, b=Ob 0110 01110110 0110 ,即 0x67665)左移運(yùn)算符()左移運(yùn)算符用來(lái)將一個(gè)數(shù)的各位全部向左移若干位。如:a=a2表示將a的各位左移2位,右邊補(bǔ)0。如果a=34(0x22或0b00100010),左 移2位得0b 10001000,即十進(jìn)制的136。高位在左移后溢 出,不起作用。從上例可以看到,a
11、被左移2位后,由34變?yōu)榱?136, 是原來(lái)的4倍。而如果左移1位,就為0bOlOOOlOO,即十 進(jìn)制的68,是原來(lái)的2倍,很顯然,左移N位,就等于乘 以了 2、。但一結(jié)論只適用于左移時(shí)被溢出的高位中不包含 T的情況。比如:a=64; /a=0b 0100 0000a=a2; /a=0b 0000 0000其實(shí)可以這樣來(lái)想,a為unsigned char型變量,值為64,左移2位后等于 乘以了 4,即64X4 = 256,而此種類型的變量在表達(dá)256 時(shí),就成為了 0x00,產(chǎn)生了一個(gè)進(jìn)位,即溢出了一個(gè)T o在作乘以2這種操作時(shí),如果使用左移,將比用乘法 快得多。因此在程序中適應(yīng)的使用左移,
12、可以提高程序的 運(yùn)行效率。6)右移運(yùn)算符右移與左移相類似,只是位移的方向不同。如:a=al表示將a的各位向右移動(dòng)1位。與左移相對(duì)應(yīng)的,左移一位就相當(dāng)于除以2, 右移N位,就相當(dāng)于除以2、。在右移的過(guò)程中,要注意的一個(gè)地方就是符號(hào)位問(wèn)題。 對(duì)于無(wú)符號(hào)數(shù)右移時(shí)左邊高位移和O o對(duì)于有符號(hào)數(shù) 來(lái)說(shuō),如果原來(lái)符號(hào)位為0,則左邊髙位為移入0, 而如果符號(hào)位為1,則左邊移入0還是1就要 看實(shí)際的編譯器了,移入0,的稱為“邏輯右移”,移 入T的稱為算術(shù)右移”。Keil中采用“算術(shù)右移” 的方式來(lái)進(jìn)行編譯。如下:d=-32; /d為有符號(hào)整型變量,值為-32,存表示為0b11100000d=dl; 右移一位 d 為 0b 11110000 即-16, Keil 采用算術(shù)邏輯進(jìn)行編譯7)位運(yùn)算賦值運(yùn)算符在對(duì)一個(gè)變量進(jìn)行了位操作中,要將其結(jié)果再賦紿該 變量,就可以使用位運(yùn)算賦值運(yùn)算符。位運(yùn)算賦值運(yùn)算符 如下:&二,丨=,二,二,二例如:a&=b相當(dāng)于a=a&b, a=2相當(dāng)于a=a2。8)不同長(zhǎng)度的數(shù)據(jù)進(jìn)行位運(yùn)算如果參與運(yùn)算的兩個(gè)數(shù)據(jù)的長(zhǎng)度不同時(shí),如a為char 型,b為int型,則
溫馨提示
- 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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年度年福建省高校教師資格證之高等教育心理學(xué)真題練習(xí)試卷B卷附答案
- 2024年交通運(yùn)輸設(shè)備項(xiàng)目資金需求報(bào)告代可行性研究報(bào)告
- 一年級(jí)數(shù)學(xué)計(jì)算題專項(xiàng)練習(xí)1000題匯編
- 2024年個(gè)人房產(chǎn)抵押貸款協(xié)議范本
- 文書模板-《勞務(wù)用工合同》
- 2024年度安置性質(zhì)房產(chǎn)購(gòu)買協(xié)議典范
- 2024老年專家返聘協(xié)議詳細(xì)條款
- 2024屆安徽省皖南八校聯(lián)盟高三4月(二診)調(diào)研測(cè)試卷(康德版)數(shù)學(xué)試題
- 2024年度建筑資產(chǎn)轉(zhuǎn)讓協(xié)議樣例
- 2024精簡(jiǎn)型牛肉購(gòu)銷協(xié)議文本
- 20以內(nèi)進(jìn)位加法100題(精心整理6套-可打印A4)
- 陜西師范大學(xué)學(xué)位英語(yǔ)試題
- 中小學(xué)反恐風(fēng)險(xiǎn)評(píng)估報(bào)告
- 品牌營(yíng)銷策略和品牌策略
- 視力矯正商業(yè)計(jì)劃書
- 醫(yī)學(xué)課件:臨床決策分析
- 幼兒園優(yōu)質(zhì)公開(kāi)課:中班音樂(lè)韻律《打噴嚏的小老鼠》課件
- 質(zhì)量管理體系品質(zhì)保證體系圖
- 人教版(新插圖)三年級(jí)上冊(cè)數(shù)學(xué) 第9課時(shí) 用乘除兩步計(jì)算 解決-歸總問(wèn)題 教學(xué)課件
- 《現(xiàn)代漢語(yǔ)》考試復(fù)習(xí)題庫(kù)及答案
- 13J104《蒸壓加氣混凝土砌塊、板材構(gòu)造》
評(píng)論
0/150
提交評(píng)論