愛伊米

Arduino--語法05

七、指標運算子

7.1*取消引用運算子

指標運算子

&(取地址)和*(取地址所指的值)

指標對C語言初學者來說是一個比較複雜的內容, 但是編寫大部分arduino程式碼時可以不用涉及到指標。然而,操作某些資料結構時,使用指標能夠簡化程式碼,但是指標的操作知識很難在Arduino工具書中找到,可以參考C語言相關工具書。

7.2&引用運算子

詳見7.1*取消引用運算子

八、位運算子

8.1&(按位與)

按位與(&):

按位運算子對變數進行位級別的計算。它們能解決很多常見的程式設計問題。下面的材料大多來自這個非常棒的按位運算指導。

說明和語法:

下面是所有的運算子的說明和語法。進一步的詳細資料,可參考教程。

按位與(&)

位運算子與在C++中是一個&符,用在兩個整型變數之間。按位與運算子對兩側的變數的每一位都進行運算,規則是:如果兩個運算元都是1,則結果為1,否則輸出0。另一種表達方式:

在Arduino中, int型別為16位, 所以在兩個int表示式之間使用&會進行16個並行按位與計算。程式碼片段就像這樣:

按位與最常見的作用是從整型變數中選取特定的位,也就是遮蔽。見下方的例子。

按位或(|):

按位或運算子在C++中是|。和&運算子類似,運算子對兩個變數的為一位都進行運算,只是運算規則不同。按位或規則:只要兩個位有一個為1則結果為1,否則為0。換句話說:

這裡是一個按位或運算在C++程式碼片段:

示例程式

按位與和按位或運算常用於埠的讀取-修改-寫入。在微控制器中,一個埠是一個8位數字,它用於表示引腳狀態。對埠進行寫入能同時操作所有引腳。

PORTD是一個內建的常數, 是指0, 1, 2, 3, 4, 5, 6, 7數字引腳的輸出狀態。如果某一位為1, 著對應管腳為HIGH。(此引腳需要先用pin Mode() 命令設定為輸出) 因此如果我們這樣寫,PORT D=B 00110001;則引腳2、3、7狀態為HIGH。這裡有個小陷阱, 我們可能同時更改了引腳0、1的狀態, 引腳0、1是Arduino序列通訊埠, 因此我們可能會干擾通訊。

我們的演算法的程式是:

讀取PORT並用按位與清除我們想要控制的引腳

用按位或對PORT D和新的值進行運算

按位異或(^)

C++中有一個不常見的運算子叫按位異或, 也叫做X OR(通常讀作”eks-or“) 。按位異或運算子用‘^‘表示。此運算子和按位或(|)很相似,區別是如果兩個位都為1則結果為0:

按位異或的另一種解釋是如果兩個位值相同則結果為0,否則為1。

下面是一個簡單的程式碼示例:

8.2|(按位或)

詳見8。1&(按位與)

8.3^(按位異或)

詳見8。1&(按位與)

日常加廣告

8.4~(按位非)

按位取反(~)

按位取反在C++語言中是波浪號~。與&(按位與)和|(按位或)不同,按位取反使用在一個運算元的右側。按位取反將運算元改變為它的“反面”:0變為1,1變成0。例如:

你可能會驚訝地看到結果為像-104這樣的數字。這是因為整數型變數的最高位,即所謂的符號位。如果最高位是1,這個數字將變為負數。這個正數和負數的編碼被稱為補。想了解更多資訊,請參考Wikipedia文章two’s complement。

順便說一句,有趣的是,要注意對於任何整數型運算元X,~X和-X-1是相同的。

有時,對帶有符號的整數型運算元進行位操作可以造成一些不必要的意外。

8.5

bitshift left()

描述:

出自Playground的The Bit math Tutorial在C++語言中有兩個移位運算子:左移位運算子(《)和右移運算子(》)。這些運算子可使左運算元中的某些位移動右運算元中指定的位數。

語法:

variablenumber_of bits

引數:

variable-(byte, int, long) number_of_bits integer

(注:紅色部分為箭頭,不是小於等於號!!!)

如果你確定位移不會引起資料溢位,你可以簡單的把左移運算當做對左運算元進行2的右運算元次方的操作。例如,要產生2的次方,可使用下面的方式:

當你將x右移y位(x>>y) , 如果x最高位是1, 位移結果將取決於x的資料型別。如果x是int型別, 最高位為符號位, 確定是否x是負數或不是, 正如我們上面的討論。如果x型別為int, 則最高位是符號位,正如我們以前討論過,符號位表示x是正還是負。在這種情況下,由於深奧的歷史原因,符號位被複制到較低位:(具體啥原因我也不知道)

這種結果,被稱為符號擴充套件,往往不是你想要的行為。你可能希望左邊被移入的數是0。右移操作對無符號整型來說會有不同結果,你可以透過資料強制轉換改變從左邊移入的資料:

如果你能小心的避免符號擴充套件問題,你可以將右移操作當做對資料除2運算。例如:

8.6>>(右移位運算子)

詳見8。5

休息一下

接下來

你們將會感受到

語言的快樂

Arduino--語法05

九、複合運算子

9.1++(遞增)

++(遞增)/--(遞減)

9.2--(遞減)

詳見9。1++(遞增)

9.3+=(複合加)

+=,一=,*=,/=

9.4-=(複合減)

詳見9。3+=(複合加)

9.5*=(複合乘)

詳見9。3+=(複合加)

9.6/=(複合除)

詳見9。3+=(複合加)

9.7&=(複合運算按位與)

描述:

複合運算按位與運算子(&=)經常被用來將一個變數和常量進行運算使變數某些位變為0。這通常被稱為“清算”或“復位”位程式設計指南。

9.8=(複合運算按位或)

例如:

Arduino--語法05