一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

單片機(jī)C51語(yǔ)言的位操作及其應(yīng)用詳細(xì)說(shuō)明

Wildesbeast ? 來(lái)源:未知 ? 2019-10-13 09:33 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

在對(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提供了幾種位操作符,如下表所示:

1)“按位與”運(yùn)算符(&)

參加運(yùn)算的兩個(gè)數(shù)據(jù),按二進(jìn)位進(jìn)行“與”運(yùn)算。原則是全1為1,有0為0,即:

0&0=0; 0&1=0; 1&0=0; 1&1=1;

如下例:

a=5&3; //a=(0b 0101) & (0b 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) & (0b1101) =0b 1001 =-7

在實(shí)際的應(yīng)用中與操作經(jīng)常被用于實(shí)現(xiàn)特定的功能:

1.清零

“按位與”通常被用來(lái)使變量中的某一位清零。如下例:

a=0xfe; //a=0b 11111110

a=a&0x55;

//使變量a的第1位、第3位、第5位、第7位清零 a= 0b 01010100

2.檢測(cè)位

要知道一個(gè)變量中某一位是‘1’還是‘0’,可以使用與操作來(lái)實(shí)現(xiàn)。

a=0xf5; //a=0b 11110101

result=a&0x08; //檢測(cè)a的第三位,result=0

3.保留變量的某一位

要屏蔽某一個(gè)變量的其它位,而保留某些位,也可以使用與操作來(lái)實(shí)現(xiàn)。

a=0x55; //a=0b 01010101

a=a&0x0f; //將高四位清零,而保留低四位 a=0x05

2)“按位或”運(yùn)算符(|)

參與或操作的兩個(gè)位,只要有一個(gè)為‘1’,則結(jié)果為‘1’。即有‘1’為‘1’,全‘0’為‘0’。

0|0=0; 0|1=1; 1|0=1; 1|1=1;

例如:

a=0x30|0x0f; //a=(0b00110000)|(0b00001111)=(0b00111111)=0x3f

“按位或”運(yùn)算最普遍的應(yīng)用就是對(duì)一個(gè)變量的某些位置‘1’。如下例:

a=0x00; //a=0b 00000000

a=a|0x7f; //將a的低7位置為1,a=0x7f

3)“異或”運(yùn)算符(^)

異或運(yùn)算符^又被稱為XOR運(yùn)算符。當(dāng)參與運(yùn)算的兩個(gè)位相同(‘1’與‘1’或‘0’與‘0’)時(shí)結(jié)果為‘0’。不同時(shí)為‘1’。即相同為0,不同為1。

0^0=0; 0^1=1; 1^0=1;1^1=0;

例如:

a=0x55^0x3f; //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=0b00110101

a=a^0x0f; //a=0b00111010 a的低四位翻轉(zhuǎn)

關(guān)于異或的這一作用,有一個(gè)典型的應(yīng)用,即取浮點(diǎn)的相反數(shù),具體的實(shí)現(xiàn)如下:

f=1.23; //f為浮點(diǎn)型變量值為1.23

f=f*-1; //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=0xff; //a=0b11111111

a=a^0x0f; //a=0b11110000 與0x0f作異或,高四位不變,低四位翻轉(zhuǎn)

3.交換兩個(gè)變量的值,而不用臨時(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=*pa^*pb;

*pb=*pa^*pb;

*pa=*pa^*pb; //采用異或?qū)崿F(xiàn)變量對(duì)調(diào)

}

從上例中可以看到異或運(yùn)算在開發(fā)中是非常實(shí)用和神奇的。

4)“取反”運(yùn)算符(~)

與其它運(yùn)算符不同,“取反”運(yùn)算符為單目運(yùn)算符,即它的操作數(shù)只有一個(gè)。它的功能就是對(duì)操作數(shù)按位取反。也就是是‘1’得‘0’,是‘0’得‘1’。

~1=0; ~0=1;

如下例:

a=0xff; //a=0b11111111

a=~a; //a=0b00000000

1.對(duì)小于0的有符號(hào)整型變量取相反數(shù)

d=-1;

//d為有符號(hào)整型變量,賦值為-1,內(nèi)存表示為0b 11111111 11111111

d=~d+1; //取d的相反數(shù),d=1,內(nèi)存表示0b 00000000 00000001

此例運(yùn)用了負(fù)整型數(shù)在內(nèi)存以補(bǔ)碼方式來(lái)存儲(chǔ)的這一原理來(lái)實(shí)現(xiàn)的。負(fù)數(shù)的補(bǔ)碼方式是這樣的:負(fù)數(shù)的絕對(duì)值的內(nèi)存表示取反加1,就為此負(fù)數(shù)的內(nèi)存表示。如-23如果為八位有符號(hào)整型數(shù),則其絕對(duì)值23的內(nèi)存表示為0b00010111,對(duì)其取反則為0b11101000,再加1為0b11101001,即為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=0b 0110 0111

a=a&0xfe; //a=0b 0110 0110

上面的程序似乎沒(méi)有什么問(wèn)題,使用0xfe這一因子就可以實(shí)現(xiàn)一個(gè)unsigned char型的變量最低位清零。但如果在另一種單片機(jī)中的unsigned char類型被定義為16個(gè)位(兩個(gè)字節(jié)),那么這種方法就會(huì)出錯(cuò),如下:

b=0x6767; //假設(shè)b為另一種單片機(jī)中的unsigned char 類型變量,值為0b 0110 0111 0110 0111

b=b&0xfe; //如果此時(shí)因子仍為0xfe的話,則結(jié)果就為0b 0000 0000 0110 0110 即0x0066,而與0x6766不相吻合

上例中的問(wèn)題就是因?yàn)椴煌h(huán)境中的數(shù)據(jù)類型差異所造成的,即程序的可移植性不好。對(duì)于這種情況可以采用如下方法來(lái)解決:

a=0x67; //a=0b 0110 0111

a=a&~1; //在不同的環(huán)境中~1將自動(dòng)匹配運(yùn)算因子,實(shí)現(xiàn)最后一位清零a=0x66 其中~1為 0b 11111110

b=0x6767; //a=0b 0110 0111 0110 0111

b=a&~1; //~1=0b 1111 1111 1111 1110,b=0b 0110 0111 0110 0110 ,即0x6766

5)左移運(yùn)算符(《《)

左移運(yùn)算符用來(lái)將一個(gè)數(shù)的各位全部向左移若干位。如:

a=a《《2

表示將a的各位左移2位,右邊補(bǔ)0。如果a=34(0x22或0b00100010),左移2位得0b10001000,即十進(jìn)制的136。高位在左移后溢出,不起作用。

從上例可以看到,a被左移2位后,由34變?yōu)榱?36,是原來(lái)的4倍。而如果左移1位,就為0b01000100,即十進(jìn)制的68,是原來(lái)的2倍,很顯然,左移N位,就等于乘以了2N。但一結(jié)論只適用于左移時(shí)被溢出的高位中不包含‘1’的情況。比如:

a=64; //a=0b 0100 0000

a=a《《2; //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è)‘1’。

在作乘以2N這種操作時(shí),如果使用左移,將比用乘法快得多。因此在程序中適應(yīng)的使用左移,可以提高程序的運(yùn)行效率。

6)右移運(yùn)算符

右移與左移相類似,只是位移的方向不同。如:

a=a》》1

表示將a的各位向右移動(dòng)1位。與左移相對(duì)應(yīng)的,左移一位就相當(dāng)于除以2,右移N位,就相當(dāng)于除以2N。

在右移的過(guò)程中,要注意的一個(gè)地方就是符號(hào)位問(wèn)題。對(duì)于無(wú)符號(hào)數(shù)右移時(shí)左邊高位移和‘0’。對(duì)于有符號(hào)數(shù)來(lái)說(shuō),如果原來(lái)符號(hào)位為‘0’,則左邊高位為移入‘0’,而如果符號(hào)位為‘1’,則左邊移入‘0’還是‘1’就要看實(shí)際的編譯器了,移入‘0’的稱為“邏輯右移”,移入‘1’的稱為“算術(shù)右移”。Keil中采用“算術(shù)右移”的方式來(lái)進(jìn)行編譯。如下:

d=-32; //d為有符號(hào)整型變量,值為-32,內(nèi)存表示為0b 11100000

d=d》》1;//右移一位 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》》=2。

8)不同長(zhǎng)度的數(shù)據(jù)進(jìn)行位運(yùn)算

如果參與運(yùn)算的兩個(gè)數(shù)據(jù)的長(zhǎng)度不同時(shí),如a為char型,b為int型,則編譯器會(huì)將二者按右端補(bǔ)齊。如果a為正數(shù),則會(huì)在左邊補(bǔ)滿‘0’。若a為負(fù)數(shù),左邊補(bǔ)滿‘1’。如果a為無(wú)符號(hào)整型,則左邊會(huì)添滿‘0’。

a=0x00; //a=0b 00000000

d=0xffff; //d=0b 11111111 11111111

d&=a; //a為無(wú)符號(hào)型,左邊添0,補(bǔ)齊為0b 00000000 00000000,d=0b 00000000 00000000

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 單片機(jī)
    +關(guān)注

    關(guān)注

    6067

    文章

    44992

    瀏覽量

    650540
  • C51
    C51
    +關(guān)注

    關(guān)注

    5

    文章

    284

    瀏覽量

    59219
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    新概念c51單片機(jī)技術(shù)教程

    ,組件很多,基本滿足初學(xué)者的學(xué)習(xí)要求!多寫程序... AT89C51單片機(jī)的結(jié)構(gòu)原理與引腳... 跪求AT89C51單片機(jī)匯編語(yǔ)言程序...
    發(fā)表于 09-26 11:11

    51單片機(jī)c51語(yǔ)言入門教程C語(yǔ)言入門教程

    51單片機(jī)c51語(yǔ)言入門教程,C語(yǔ)言入門教程
    發(fā)表于 08-29 15:02 ?33次下載

    單片機(jī)教程之單片機(jī)C51基礎(chǔ)知識(shí)詳細(xì)資料概述

    兩種51單片機(jī)編程語(yǔ)言:匯編語(yǔ)言C51語(yǔ)言 匯編語(yǔ)言
    發(fā)表于 10-30 08:00 ?12次下載
    <b class='flag-5'>單片機(jī)</b>教程之<b class='flag-5'>單片機(jī)</b>的<b class='flag-5'>C51</b>基礎(chǔ)知識(shí)<b class='flag-5'>詳細(xì)</b>資料概述

    51單片機(jī)教程之80C51單片機(jī)C語(yǔ)言程序設(shè)計(jì)資料概述

    本文檔的主要內(nèi)容詳細(xì)介紹的是51單片機(jī)教程之80C51單片機(jī)C
    發(fā)表于 12-05 11:53 ?299次下載
    <b class='flag-5'>51</b><b class='flag-5'>單片機(jī)</b>教程之80<b class='flag-5'>C51</b><b class='flag-5'>單片機(jī)</b>的<b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b>程序設(shè)計(jì)資料概述

    51單片機(jī)C51語(yǔ)言的scanf和printf是如何使用的詳細(xì)程序說(shuō)明

    本文檔的主要內(nèi)容詳細(xì)介紹的是51單片機(jī)C語(yǔ)言的scanf和printf是如何使用的詳細(xì)程序
    發(fā)表于 08-26 17:30 ?26次下載
    <b class='flag-5'>51</b><b class='flag-5'>單片機(jī)</b><b class='flag-5'>C51</b><b class='flag-5'>語(yǔ)言</b>的scanf和printf是如何使用的<b class='flag-5'>詳細(xì)</b>程序<b class='flag-5'>說(shuō)明</b>

    51單片機(jī)C語(yǔ)言關(guān)鍵字詳細(xì)說(shuō)明

    本文檔的主要內(nèi)容詳細(xì)介紹的是51單片機(jī)C語(yǔ)言關(guān)鍵字詳細(xì)說(shuō)明。
    發(fā)表于 08-21 17:31 ?5次下載
    <b class='flag-5'>51</b><b class='flag-5'>單片機(jī)</b>的<b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b>關(guān)鍵字<b class='flag-5'>詳細(xì)說(shuō)明</b>

    51單片機(jī)C程序基本架構(gòu)詳細(xì)說(shuō)明

    本文檔的主要內(nèi)容詳細(xì)介紹的是51單片機(jī)C程序基本架構(gòu)詳細(xì)說(shuō)明。
    發(fā)表于 08-15 17:32 ?8次下載
    <b class='flag-5'>51</b><b class='flag-5'>單片機(jī)</b>的<b class='flag-5'>C</b>程序基本架構(gòu)<b class='flag-5'>詳細(xì)說(shuō)明</b>

    單片機(jī)C51編程的警告提示說(shuō)明

    本文檔的主要內(nèi)容詳細(xì)介紹的是單片機(jī)C51編程的警告提示說(shuō)明資料免費(fèi)下載。
    發(fā)表于 08-02 17:34 ?2次下載
    <b class='flag-5'>單片機(jī)</b><b class='flag-5'>C51</b>編程的警告提示<b class='flag-5'>說(shuō)明</b>

    單片機(jī)C51的interrupt和using用法詳細(xì)資料說(shuō)明

    本文檔的主要內(nèi)容詳細(xì)介紹的是單片機(jī)C51的interrupt和using用法詳細(xì)資料說(shuō)明。
    發(fā)表于 07-17 17:38 ?5次下載
    <b class='flag-5'>單片機(jī)</b><b class='flag-5'>C51</b>的interrupt和using用法<b class='flag-5'>詳細(xì)</b>資料<b class='flag-5'>說(shuō)明</b>

    使用C51單片機(jī)和Proteus仿真進(jìn)行的RTX51操作系統(tǒng)應(yīng)用實(shí)例資料說(shuō)明

    本文檔的主要內(nèi)容詳細(xì)介紹的是使用C51單片機(jī)和Proteus仿真進(jìn)行的RTX51操作系統(tǒng)應(yīng)用實(shí)例資料說(shuō)明
    發(fā)表于 05-20 08:00 ?8次下載
    使用<b class='flag-5'>C51</b><b class='flag-5'>單片機(jī)</b>和Proteus仿真進(jìn)行的RTX<b class='flag-5'>51</b><b class='flag-5'>操作</b>系統(tǒng)應(yīng)用實(shí)例資料<b class='flag-5'>說(shuō)明</b>

    單片機(jī)C語(yǔ)言編程的關(guān)鍵字詳細(xì)說(shuō)明

    本文檔的主要內(nèi)容詳細(xì)介紹的是單片機(jī)C語(yǔ)言編程的關(guān)鍵字詳細(xì)說(shuō)明
    發(fā)表于 12-10 17:32 ?23次下載
    <b class='flag-5'>單片機(jī)</b><b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b>編程的關(guān)鍵字<b class='flag-5'>詳細(xì)說(shuō)明</b>

    C51單片機(jī)驅(qū)動(dòng)的安裝教程詳細(xì)說(shuō)明

    本文檔的主要內(nèi)容詳細(xì)介紹的是C51單片機(jī)驅(qū)動(dòng)的安裝教程詳細(xì)說(shuō)明
    發(fā)表于 01-13 08:00 ?7次下載
    <b class='flag-5'>C51</b><b class='flag-5'>單片機(jī)</b>驅(qū)動(dòng)的安裝教程<b class='flag-5'>詳細(xì)說(shuō)明</b>

    單片機(jī)C51語(yǔ)言程序設(shè)計(jì)基礎(chǔ)的資料合集免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是單片機(jī)C51語(yǔ)言程序設(shè)計(jì)基礎(chǔ)的資料合集免費(fèi)下載包括了:單片機(jī)開發(fā)概述,構(gòu)建C
    發(fā)表于 03-16 08:00 ?19次下載
    <b class='flag-5'>單片機(jī)</b><b class='flag-5'>C51</b><b class='flag-5'>語(yǔ)言</b>程序設(shè)計(jì)基礎(chǔ)的資料合集免費(fèi)下載

    單片機(jī)C51語(yǔ)言程序設(shè)計(jì)的基礎(chǔ)資料詳細(xì)說(shuō)明

    單片機(jī)C51語(yǔ)言既具有匯編語(yǔ)言對(duì)操作硬件的功能,又兼有高級(jí)編程語(yǔ)言的許多優(yōu)點(diǎn)。在現(xiàn)代的
    發(fā)表于 03-16 17:08 ?39次下載
    <b class='flag-5'>單片機(jī)</b><b class='flag-5'>C51</b><b class='flag-5'>語(yǔ)言</b>程序設(shè)計(jì)的基礎(chǔ)資料<b class='flag-5'>詳細(xì)說(shuō)明</b>

    51單片機(jī)學(xué)習(xí)筆記4 C51語(yǔ)言

    C51語(yǔ)言??C51語(yǔ)言與標(biāo)準(zhǔn)C語(yǔ)言間有許多相同地方,但也有自身特點(diǎn)。不同的嵌入式
    發(fā)表于 11-21 09:51 ?42次下載
    <b class='flag-5'>51</b><b class='flag-5'>單片機(jī)</b>學(xué)習(xí)筆記4 <b class='flag-5'>C51</b><b class='flag-5'>語(yǔ)言</b>