色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

單片機C51語言的位操作及其應用詳細說明

Wildesbeast ? 來源:未知 ? 2019-10-13 09:33 ? 次閱讀

在對單片機進行編程的過程中,對位的操作是經常遇到的。C51對位的操控能力是非常強大的。從這一點上,就可以看出C不光具有高級語言的靈活性,又有低級語言貼近硬件的特點。這也是在各個領域中都可以看到C的重要原因。在這一節中將詳細講解C51中的位操作及其應用。

1、位運算符

C51提供了幾種位操作符,如下表所示:

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

參加運算的兩個數據,按二進位進行“與”運算。原則是全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

那么如果參加運算的兩個數為負數,又該如何算呢?會以其補碼形式表示的二進制數來進行與運算。

a=-5&-3; //a=(0b 1011) & (0b1101) =0b 1001 =-7

在實際的應用中與操作經常被用于實現特定的功能:

1.清零

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

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

a=a&0x55;

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

2.檢測

要知道一個變量中某一位是‘1’還是‘0’,可以使用與操作來實現。

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

result=a&0x08; //檢測a的第三位,result=0

3.保留變量的某一位

要屏蔽某一個變量的其它位,而保留某些位,也可以使用與操作來實現。

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

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

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

參與或操作的兩個位,只要有一個為‘1’,則結果為‘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

“按位或”運算最普遍的應用就是對一個變量的某些位置‘1’。如下例:

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

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

3)“異或”運算符(^)

異或運算符^又被稱為XOR運算符。當參與運算的兩個位相同(‘1’與‘1’或‘0’與‘0’)時結果為‘0’。不同時為‘1’。即相同為0,不同為1。

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

例如:

a=0x55^0x3f; //a=(0b01010101)^(0b00111111)=(0b01101010)=0x6a

異或運算主要有以下幾種應用:

1.翻轉某一位

當一個位與‘1’作異或運算時結果就為此位翻轉后的值。如下例:

a=0x35; //a=0b00110101

a=a^0x0f; //a=0b00111010 a的低四位翻轉

關于異或的這一作用,有一個典型的應用,即取浮點的相反數,具體的實現如下:

f=1.23; //f為浮點型變量值為1.23

f=f*-1; //f乘以-1,實現取其相反數,要進行一次乘運算

f=1.23;

((unsigned char *)&f)[0]^=0x80; //將浮點數f的符號位進行翻轉實現取相反數

2.保留原值

當一個位與‘0’作異或運算時,結果就為此位的值。如下例:

a=0xff; //a=0b11111111

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

3.交換兩個變量的值,而不用臨時變量

要交換兩個變量的值,傳統的方法都需要一個臨時變量。實現如下:

void swap(unsigned char *pa,unsigned char *pb)

{

unsigned char temp=*pa;//定義臨時變量,將pa指向的變量值賦給它

*pa=*pb;

*pb=temp;//變量值對調

}

而使用異或的方法來實現,就可以不用臨時變量,如下:

void swap_xor(unsigned char *pa,unsigned char *pb)

{

*pa=*pa^*pb;

*pb=*pa^*pb;

*pa=*pa^*pb; //采用異或實現變量對調

}

從上例中可以看到異或運算在開發中是非常實用和神奇的。

4)“取反”運算符(~)

與其它運算符不同,“取反”運算符為單目運算符,即它的操作數只有一個。它的功能就是對操作數按位取反。也就是是‘1’得‘0’,是‘0’得‘1’。

~1=0; ~0=1;

如下例:

a=0xff; //a=0b11111111

a=~a; //a=0b00000000

1.對小于0的有符號整型變量取相反數

d=-1;

//d為有符號整型變量,賦值為-1,內存表示為0b 11111111 11111111

d=~d+1; //取d的相反數,d=1,內存表示0b 00000000 00000001

此例運用了負整型數在內存以補碼方式來存儲的這一原理來實現的。負數的補碼方式是這樣的:負數的絕對值的內存表示取反加1,就為此負數的內存表示。如-23如果為八位有符號整型數,則其絕對值23的內存表示為0b00010111,對其取反則為0b11101000,再加1為0b11101001,即為0XE9,與Keil仿真結果是相吻合的:

2.增強可移植性

關于“增強可移植性”用以下實例來講解:

假如在一種單片機中unsigned char類型是八個位(1個字節),那么一個此類型的變量a=0x67,對其最低位清零。則可以用以下方法:

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

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

上面的程序似乎沒有什么問題,使用0xfe這一因子就可以實現一個unsigned char型的變量最低位清零。但如果在另一種單片機中的unsigned char類型被定義為16個位(兩個字節),那么這種方法就會出錯,如下:

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

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

上例中的問題就是因為不同環境中的數據類型差異所造成的,即程序的可移植性不好。對于這種情況可以采用如下方法來解決:

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

a=a&~1; //在不同的環境中~1將自動匹配運算因子,實現最后一位清零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)左移運算符(《《)

左移運算符用來將一個數的各位全部向左移若干位。如:

a=a《《2

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

從上例可以看到,a被左移2位后,由34變為了136,是原來的4倍。而如果左移1位,就為0b01000100,即十進制的68,是原來的2倍,很顯然,左移N位,就等于乘以了2N。但一結論只適用于左移時被溢出的高位中不包含‘1’的情況。比如:

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

a=a《《2; //a=0b 0000 0000

其實可以這樣來想,a為unsigned char型變量,值為64,左移2位后等于乘以了4,即64X4=256,而此種類型的變量在表達256時,就成為了0x00,產生了一個進位,即溢出了一個‘1’。

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

6)右移運算符

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

a=a》》1

表示將a的各位向右移動1位。與左移相對應的,左移一位就相當于除以2,右移N位,就相當于除以2N。

在右移的過程中,要注意的一個地方就是符號位問題。對于無符號數右移時左邊高位移和‘0’。對于有符號數來說,如果原來符號位為‘0’,則左邊高位為移入‘0’,而如果符號位為‘1’,則左邊移入‘0’還是‘1’就要看實際的編譯器了,移入‘0’的稱為“邏輯右移”,移入‘1’的稱為“算術右移”。Keil中采用“算術右移”的方式來進行編譯。如下:

d=-32; //d為有符號整型變量,值為-32,內存表示為0b 11100000

d=d》》1;//右移一位 d為 0b 11110000 即-16,Keil采用“算術邏輯”進行編譯

7)位運算賦值運算符

在對一個變量進行了位操作中,要將其結果再賦給該變量,就可以使用位運算賦值運算符。位運算賦值運算符如下:

&=, |=,^=,~=,《《=, 》》=

例如:a&=b相當于a=a&b,a》》=2相當于a》》=2。

8)不同長度的數據進行位運算

如果參與運算的兩個數據的長度不同時,如a為char型,b為int型,則編譯器會將二者按右端補齊。如果a為正數,則會在左邊補滿‘0’。若a為負數,左邊補滿‘1’。如果a為無符號整型,則左邊會添滿‘0’。

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

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

d&=a; //a為無符號型,左邊添0,補齊為0b 00000000 00000000,d=0b 00000000 00000000

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 單片機
    +關注

    關注

    6035

    文章

    44554

    瀏覽量

    634634
  • C51
    C51
    +關注

    關注

    5

    文章

    283

    瀏覽量

    58070
收藏 人收藏

    評論

    相關推薦

    新概念c51單片機技術教程

    ,組件很多,基本滿足初學者的學習要求!多寫程序... AT89C51單片機的結構原理與引腳... 跪求AT89C51單片機匯編語言程序...
    發表于 09-26 11:11

    51單片機c51語言入門教程C語言入門教程

    51單片機c51語言入門教程,C語言入門教程
    發表于 08-29 15:02 ?32次下載

    單片機教程之單片機C51基礎知識詳細資料概述

    兩種51單片機編程語言:匯編語言C51語言 匯編語言
    發表于 10-30 08:00 ?12次下載
    <b class='flag-5'>單片機</b>教程之<b class='flag-5'>單片機</b>的<b class='flag-5'>C51</b>基礎知識<b class='flag-5'>詳細</b>資料概述

    51單片機教程之80C51單片機C語言程序設計資料概述

    本文檔的主要內容詳細介紹的是51單片機教程之80C51單片機C
    發表于 12-05 11:53 ?299次下載
    <b class='flag-5'>51</b><b class='flag-5'>單片機</b>教程之80<b class='flag-5'>C51</b><b class='flag-5'>單片機</b>的<b class='flag-5'>C</b><b class='flag-5'>語言</b>程序設計資料概述

    51單片機C51語言的scanf和printf是如何使用的詳細程序說明

    本文檔的主要內容詳細介紹的是51單片機C語言的scanf和printf是如何使用的詳細程序
    發表于 08-26 17:30 ?24次下載
    <b class='flag-5'>51</b><b class='flag-5'>單片機</b><b class='flag-5'>C51</b><b class='flag-5'>語言</b>的scanf和printf是如何使用的<b class='flag-5'>詳細</b>程序<b class='flag-5'>說明</b>

    51單片機C語言關鍵字詳細說明

    本文檔的主要內容詳細介紹的是51單片機C語言關鍵字詳細說明
    發表于 08-21 17:31 ?5次下載
    <b class='flag-5'>51</b><b class='flag-5'>單片機</b>的<b class='flag-5'>C</b><b class='flag-5'>語言</b>關鍵字<b class='flag-5'>詳細說明</b>

    51單片機C程序基本架構詳細說明

    本文檔的主要內容詳細介紹的是51單片機C程序基本架構詳細說明
    發表于 08-15 17:32 ?7次下載
    <b class='flag-5'>51</b><b class='flag-5'>單片機</b>的<b class='flag-5'>C</b>程序基本架構<b class='flag-5'>詳細說明</b>

    單片機C51編程的警告提示說明

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

    單片機C51的interrupt和using用法詳細資料說明

    本文檔的主要內容詳細介紹的是單片機C51的interrupt和using用法詳細資料說明
    發表于 07-17 17:38 ?5次下載
    <b class='flag-5'>單片機</b><b class='flag-5'>C51</b>的interrupt和using用法<b class='flag-5'>詳細</b>資料<b class='flag-5'>說明</b>

    使用C51單片機和Proteus仿真進行的RTX51操作系統應用實例資料說明

    本文檔的主要內容詳細介紹的是使用C51單片機和Proteus仿真進行的RTX51操作系統應用實例資料說明
    發表于 05-20 08:00 ?8次下載
    使用<b class='flag-5'>C51</b><b class='flag-5'>單片機</b>和Proteus仿真進行的RTX<b class='flag-5'>51</b><b class='flag-5'>操作</b>系統應用實例資料<b class='flag-5'>說明</b>

    單片機C語言編程的關鍵字詳細說明

    本文檔的主要內容詳細介紹的是單片機C語言編程的關鍵字詳細說明
    發表于 12-10 17:32 ?23次下載
    <b class='flag-5'>單片機</b><b class='flag-5'>C</b><b class='flag-5'>語言</b>編程的關鍵字<b class='flag-5'>詳細說明</b>

    C51單片機驅動的安裝教程詳細說明

    本文檔的主要內容詳細介紹的是C51單片機驅動的安裝教程詳細說明
    發表于 01-13 08:00 ?7次下載
    <b class='flag-5'>C51</b><b class='flag-5'>單片機</b>驅動的安裝教程<b class='flag-5'>詳細說明</b>

    單片機C51語言程序設計基礎的資料合集免費下載

    本文檔的主要內容詳細介紹的是單片機C51語言程序設計基礎的資料合集免費下載包括了:單片機開發概述,構建C
    發表于 03-16 08:00 ?18次下載
    <b class='flag-5'>單片機</b><b class='flag-5'>C51</b><b class='flag-5'>語言</b>程序設計基礎的資料合集免費下載

    單片機C51語言程序設計的基礎資料詳細說明

    單片機C51語言既具有匯編語言操作硬件的功能,又兼有高級編程語言的許多優點。在現代的
    發表于 03-16 17:08 ?39次下載
    <b class='flag-5'>單片機</b><b class='flag-5'>C51</b><b class='flag-5'>語言</b>程序設計的基礎資料<b class='flag-5'>詳細說明</b>

    51單片機學習筆記4 C51語言

    C51語言??C51語言與標準C語言間有許多相同地方,但也有自身特點。不同的嵌入式
    發表于 11-21 09:51 ?42次下載
    <b class='flag-5'>51</b><b class='flag-5'>單片機</b>學習筆記4 <b class='flag-5'>C51</b><b class='flag-5'>語言</b>
    主站蜘蛛池模板: 无码国产成人777爽死在线观看| 亚洲人成www在线播放| 在线 国产 欧美 亚洲 天堂| 成在线人免费视频| 久久热精品18国产| 天美传媒麻豆精品| 99久久亚洲综合精品| 黄小飞二人转| 四房播播开心色播| 99精品视频一区在线视频免费观看| 好紧的小嫩嫩17p| 日韩hd高清xxxⅹ| 51国产午夜精品免费视频| 狠狠色狠狠色综合日日91app| 牲高潮99爽久久久久777| 99精品影视| 久久综合给合久久狠狠狠…| 无码任你躁久久久久久久| 啊灬啊灬啊灬快灬深高潮啦| 麻豆免费观看高清完整视频在线 | 日本夜夜夜| 97se se| 精品久久久99大香线蕉| 日韩人妻无码精品久久中文字幕| 91热久久免费频精品动漫99| 久cao在线香蕉| 亚洲成人免费在线| 嘟嘟嘟WWW免费高清在线中文| 免费观看a视频| 伊人久久中文| 精品网站一区二区三区网站| 午夜福利免费0948视频| 东北嫖妓对白粗口| 玛雅成人网| 在线看免费毛片| 久久九九少妇免费看A片| 亚洲精品一区三区三区在线观看 | 色综合久久综合网观看| youjizz怎么看| 欧美亚洲综合另类无码| BL低喘贯穿顶弄老师H|