(玩(wan)電(dian)子(zi)) 電(dian)子(zi)技術學習與研究(jiu)
當(dang)前位置︰單片機教程網(wang) >> 基礎教程 >> 瀏覽(lan)文章(zhang)

幸运11选5官网

作者:佚名   來源:本(ben)站原(yuan)創   點擊數:x  更新時間︰2020年02月10日   【字體︰

學過匯編的朋友都知道匯編對位的處理能力是很強的,但是單片機C語言也能對運算對象進行(xing)按位操作,從(cong)而使單片機C語言也能具有一(yi)定(ding)的對硬件直接進行(xing)操作的能力。位運算符(fu)的作用是按位對變量(liang)進行(xing)運算,但是並不改變參與運算的變量(liang)的值(zhi)。如果要求按位改變變量(liang)的值(zhi),則要利用相應的賦值(zhi)運算。還有就是位運算符(fu)是不能用來對浮(fu)點型數據進行(xing)操作的。單片機c語言中共有6種位運算符(fu)。位運算一(yi)般的表達形式如下︰

變量(liang) 1  位運算符(fu)  變量(liang) 2 位運算符(fu)也有優先級,從(cong)高到jiang)鴕來問“~”(按位取反)→“<<”(左移(yi))  →“>>”(右(you)

移(yi))  →“&”(按位與)→“^”(按位異或)→“”(按位或)

表 8-1 是位邏輯運算符(fu)的真值(zhi)表,X 表示變量(liang) 1,Y 表示變量(liang) 2

X

Y

~X

~Y

X&Y

XY

X^Y

0

0

1

1

0

0

0

0

1

1

0

0

1

1

1

0

0

1

0

1

1

1

1

0

0

1

1

0

表 8-1    按位取反,與,或和(he)異或的邏輯真值(zhi)表

利用以(yi)前建(jian)立(li)起來的實驗板(ban),我(wo)們來做個實驗驗證一(yi)下位運算是否真是不改變參與變量(liang) 的值(zhi),同時學習位運算的表達形式。程序(xu)很簡單,用 P1 口做運算變量(liang),P1.0-P1.7 對應 P1 變量(liang)的最低(di)位到最高位,通過連接在(zai) P1 口上的 LED 我(wo)們便能直觀看到每個位運算後變量(liang) 是否有改變或如何改變。程序(xu)如下︰

#include  <at89x51.h>

void  main(void)

{

unsigned  int  a;

unsigned  int  b;

unsigned  char  temp;  //臨(lin)時變量(liang)

P1  =  0xAA;  //點亮 D1,D3,D5,D7  P1 口的二進制(zhi)為(wei) 10101010,為(wei) 0 時點亮 LED

for  (a=0;a<1000;a++)

for  (b=0;b<1000;b++);  //延時

temp = P1 & 0x7; //單純(chun)的寫 P10x7 是沒有意義的,因為(wei)沒有變量(liang)被影響,不會被編譯

//執行(xing) P1∣0x7 後結(jie)果存入temp,這個時候改變的是 temp,但 P1 不會被影響。

//這個時候 LED 沒有變化,仍然是 D1,D3,D5,D7 亮

for  (a=0;a<1000;a++)

for  (b=0;b<1000;b++);  //延時 P1  =  0xFF;  //熄滅 LED

for  (a=0;a<1000;a++)

for  (b=0;b<1000;b++);  //延時

P1  =  0xAA;  //點亮 D1,D3,D5,D7  P1 口的二進制(zhi)為(wei) 10101010,為(wei) 0 時點亮 LED

for  (a=0;a<1000;a++)

for  (b=0;b<1000;b++);  //延時


P1  =  P1  &  0x7;  //這個時候 LED 會變得只有 D2 滅

//因為(wei)之前 P1=0xAA=10101010

//與 0x7 位與     0x7=00000111

//結(jie)果存入 P1     P1=00000010  //位為(wei) O 時點亮 LED,電(dian)路看第(di)三(san)課

for  (a=0;a<1000;a++)

for  (b=0;b<1000;b++);  //延時 P1  =  0xFF;  //熄滅 LED

while(1);

//大家能根(gen)據上面的程序(xu)去(qu)做位或,左移(yi),取反等等。

}

復合賦值(zhi)運算符(fu)

復合賦值(zhi)運算符(fu)就是在(zai)賦值(zhi)運算符(fu)“=”的前面加上其他運算符(fu)。以(yi)下是 C 語言中的復 合賦值(zhi)運算符(fu)︰

+=

加法(fa)賦值(zhi)

>>=

右(you)移(yi)位賦值(zhi)

-=

減(jian)法(fa)賦值(zhi)

&=

邏輯與賦值(zhi)

*=

乘(cheng)法(fa)賦值(zhi)

=

邏輯或賦值(zhi)

/=

除法(fa)賦值(zhi)

^=

邏輯異或賦值(zhi)

%=    取模賦值(zhi)       -=    邏輯非賦值(zhi)

<<=  左移(yi)位賦值(zhi) 復合運算的一(yi)般形式為(wei)︰

變量(liang)    復合賦值(zhi)運算符(fu)    表達式 其含義就是變量(liang)與表達式先進行(xing)運算符(fu)所(suo)要求的運算,再把運算結(jie)果賦值(zhi)給參與運算的

變量(liang)。其實這是 C 語言中一(yi)種簡化程序(xu)的一(yi)種方法(fa),凡是二目運算都ji)苡黴春細持zhi)運算符(fu) 去(qu)簡化表達。例如︰

a+=56 等價于(yu) a=a+56

y/=x+9  等價于(yu)  y=y/(x+9) 很明顯采(cai)用復合賦值(zhi)運算符(fu)會降(jiang)低(di)程序(xu)的可讀性,但這樣卻(que)能使程序(xu)代碼簡單化,並

能提高編譯的效率。對于(yu)開(kai)始(shi)學習 C 語言的朋友在(zai)編程時最好還是根(gen)據自己的理解(jie)力和(he)習慣去(qu)使 用程序(xu)表達的方式,不要一(yi)味追求程序(xu)代碼的短小。

逗號(hao)運算符(fu)

如果你有編程的經驗,那麼對逗號(hao)的作用也不會陌生了。如在(zai) VB 中“Dim a,b,c”的逗 號(hao)就是把多個變量(liang)定(ding)義為(wei)同一(yi)類型的變量(liang),在(zai) C 也一(yi)樣,如“int a,b,c”,這些例子(zi)說明逗 號(hao)用于(yu)分隔(ge)表達式用。但在(zai) C 語言中逗號(hao)還是一(yi)種特殊的運算符(fu),也就是逗號(hao)運算符(fu),能 用它將(jiang)兩個或多個表達式連接起來,形成逗號(hao)表達式。逗號(hao)表達式jiang)囊yi)般形式為(wei)︰

表達式 1,表達式 2,表達式 3……表達式 n

這樣用逗號(hao)運算符(fu)組成的表達式在(zai)程序(xu)運行(xing)時,是從(cong)左到右(you)計算出各(ge)個表達式jiang)鬧zhi),而 整個用逗號(hao)運算符(fu)組成的表達式jiang)鬧zhi)等于(yu)最右(you)邊表達式jiang)鬧zhi),就是“表達式 n”的值(zhi)。在(zai)實 際的應用中,大部分情況(kuang)下,使用逗號(hao)表達式jiang)哪康鬧皇俏wei)了分別得到名個表達式jiang)鬧zhi),而 並不一(yi)定(ding)要得到和(he)使用整個逗號(hao)表達式jiang)鬧zhi)。要注(zhu)意的還有,並不是在(zai)程序(xu)的任(ren)何位置出現(xian) 的逗號(hao),都ji)莧ren)為(wei)是逗號(hao)運算符(fu)。如函數中的參數,同類型變量(liang)的定(ding)義中的逗號(hao)只是用來 間隔(ge)之用而不是逗號(hao)運算符(fu)。


條(tiao)件運算符(fu)

上面我(wo)們說過單片機C語言中有一(yi)個三(san)目運算符(fu),它就是“?:”條(tiao)件運算符(fu),它要求有三(san)個運算對象。它能把三(san)個表達式連接構成一(yi)個條(tiao)件表達式。條(tiao)件表達式jiang)囊yi)般形式如下:

邏輯表達式?  表達式 1  :  表達式 2 條(tiao)件運算符(fu)的作用簡單來ci)稻褪歉gen)據邏輯表達式jiang)鬧zhi)選擇使用表達式jiang)鬧zhi)。當(dang)邏輯表達

式jiang)鬧zhi)為(wei)真時(非 0 值(zhi))時,整個表達式jiang)鬧zhi)為(wei)表達式 1 的值(zhi);當(dang)邏輯表達式jiang)鬧zhi)為(wei)假(值(zhi)

為(wei) 0)時,整個表達式jiang)鬧zhi)為(wei)表達式 2 的值(zhi)。要注(zhu)意的是條(tiao)件表達式中邏輯表達式jiang)睦嘈涂以(yi)與表達式 1 和(he)表達式 2 的類型不一(yi)樣。下面是一(yi)個邏輯表達式jiang)睦zi)。

如有 a=1,b=2 這個時候我(wo)們要求是取 ab 兩數中的較小的值(zhi)放(fang)入 min 變量(liang)中,也許你會這樣 寫︰

if  (a<b)

min  =  a;

else

min  =  b;  //這一(yi)段的意思是當(dang) a<b 時 min 的值(zhi)為(wei) a 的值(zhi),不然為(wei) b 的值(zhi)。

用條(tiao)件運算符(fu)去(qu)構成條(tiao)件表達式就變得簡單明了了︰

min  =  (a<b)?a  :  b 很明顯它的結(jie)果和(he)含意都和(he)上面的一(yi)段程序(xu)是一(yi)樣的,但是代碼卻(que)比上一(yi)段程序(xu)少很多,編譯的效率也相對要高,但有著和(he)復合賦值(zhi)表達式一(yi)樣的缺點就是可讀性相對效差。在(zai)實際應 用時根(gen)據自己要習慣使用,就我(wo)自己來ci)滴wo)喜歡使用較為(wei)好讀的方式和(he)加上適當(dang)的注(zhu)解(jie),這 樣能有助于(yu)程序(xu)的調試和(he)編寫,也便于(yu)日後的修改讀寫。

發表評論】【告訴好友】【收藏(cang)此(ci)文】【關閉(bi)窗口

幸运11选5官网

幸运11选5官网 | 下一页