“位或”的版本間的差異

來自ALSROBOT WiKi
跳轉(zhuǎn)至: 導(dǎo)航、 搜索
(以“按位或(|)<br> 在C++中按位或運算符是垂直的條桿符號,|。就像&運算符,|獨立地計算它周圍的兩個整型表達式的每一位。...”為內(nèi)容創(chuàng)建頁面)
 

2014年9月12日 (五) 13:30的最后版本

按位或(|)


在C++中按位或運算符是垂直的條桿符號,|。就像&運算符,|獨立地計算它周圍的兩個整型表達式的每一位。(當(dāng)然)它所做的是不同的(操作)。兩個輸入位其中一個或都是1按位或?qū)⒌玫?,否則為0。換句話說:

    0  0  1  1    operand1
    0  1  0  1    operand2
    ----------
    0  1  1  1    (operand1 | operand2) - returned result
 

這是一個使用一小斷C++代碼描述的按位或(運算)的例子:

    int a =  92;    // in binary: 0000000001011100
    int b = 101;    // in binary: 0000000001100101
    int c = a | b;  // result:    0000000001111101, or 125 in decimal.
 


按位與和按位或的一個共同的工作是在端口上進行程序員稱之為讀-改-寫的操作。在微控制器中,每個端口是一個8位數(shù)字,每一位表示一個引腳的狀態(tài)。寫一個端口可以同時控制所有的引腳。


PORTD是內(nèi)建的參照數(shù)字口0,1,2,3,4,5,6,7的輸出狀態(tài)的常量。如果一個比特位是1,那么該引腳置高。(引腳總是需要用pinMode()指令設(shè)置為輸出模式)。所以如果我們寫入PORTD = B00110001;我們就會讓引腳2,3和7輸出高。一個小小的問題是,我們同時也改變了某些引腳的0,1狀態(tài)。這用于Arduino與串口通訊,所以我們可能會干擾串口通訊。


我們的程序規(guī)則是:
僅僅獲取和清除我們想控制的與相應(yīng)引腳對應(yīng)的位(使用按位與)。
合并要修改的PORTD值與所控制的引腳的新值(使用按位或)。

int i;     // counter variable
int j;

void setup(){
DDRD = DDRD | B11111100; // set direction bits for pins 2 to 7, leave 0 and 1 untouched (xx | 00 == xx)
// same as pinMode(pin, OUTPUT) for pins 2 to 7
Serial.begin(9600);
}

void loop(){
for (i=0; i<64; i++){

PORTD = PORTD & B00000011;  // clear out bits 2 - 7, leave pins 0 and 1 untouched (xx & 11 == xx)
j = (i << 2);               // shift variable up to pins 2 - 7 - to avoid pins 0 and 1
PORTD = PORTD | j;          // combine the port information with the new information for LED pins
Serial.println(PORTD, BIN); // debug to show masking
delay(100);
   }
}