位元AND運算(&), 位元OR運算(|), 位元XOR運算(^)

位元運算子是用來計算變數的位元,它們可以幫忙解決各種常見的編程問題;更多有關位元運算的素材與教學可以參考這裡

描述和語法

下面是所有的運算子的語法還有說明,其他的細節可以在參考教學中找到。

位元運算 AND (&)

C++ 中位元運算 AND 以單一符號 & 表示,用在兩個整數之間,位元運算 AND 運算子會運算每一個位元位置上的值(0/1),依據固定的規則:若兩者皆為 1 則輸出是 1,其餘狀況輸出皆為 0;請參考以下範例:

        0 0 1 1   運算元1
        0 1 0 1   運算元2
        ———-
        0 0 0 1   (運算元1 & 運算元2)    –    回傳結果

在 86duino 上 int 型別將是一個 32 位元的數值,所以用在兩個 int 型別的變數上會產生 32 個 AND 運算去分別處理每個位元,像下面的程式碼範例一樣:

    int a =  92;    // in binary: 00000000000000000000000001011100
    int b = 101;    // in binary: 00000000000000000000000001100101
    int c = a & b;  // result:    00000000000000000000000001000100, or 68 in decimal.

每一個 a 與 b 的位元將會被位元運算 AND 所處理,而 32 個結果將會以二進制儲存在 c 裡面,結果會是二進制表示 01000100,以十進制表示則是 68。

最常使用的 AND 運算是從一個整數型別選定一個特別的位元(或多個),通常稱為 masking(mask表示哪一些是想留存的值,或哪些是不想留存的)。

位元運算 OR (|)

C++ 中位元運算OR以豎線符號|表示,像是&運算子一樣,位置寫在兩個整數之間,但是運算是不同的,若兩者中有一個為 1 則輸出是 1,只有兩者皆為0時輸出為 0;請參考以下範例:

        0 0 1 1    運算元1
        0 1 0 1    運算元2
        ———-
        0 1 1 1 (運算元1 | 運算元2)    –    回傳結果

以下範例是位元運算 OR 的 C++ 程式碼:

    int a =  92;    // in binary: 00000000000000000000000001011100
    int b = 101;    // in binary: 00000000000000000000000001100101
    int c = a | b;  // result:    00000000000000000000000001111101, or 125 in decimal.
位元運算 XOR (^)

這是一個特別的運算子,在 C++ 中稱為 EXCLUSIVE OR,就是位元運算中的 XOR,位元運算 XOR 以插入符號^表示,其運算方式跟 OR 運算子非常相似,差別在於 XOR 是運算的兩者中,其中一個位元為 1 而另一個為 0 時輸出才是 1:

         0 0 1 1    運算元1
         0 1 0 1    運算元2
         ———-
         0 1 1 0    (運算元 ^ 運算2)    –    回傳結果

從另一個角度看 XOR,若結果是 1 代表輸入的兩個位元不同,結果是 0 代表輸入的兩個位元相同。

以下是簡單的程式碼範例:

    int x = 12;     // binary: 1100
    int y = 10;     // binary: 1010
    int z = x ^ y;  // binary: 0110, or decimal 6

^ 運算子常用來整數 bit 的切換(0=>1 或是 1=>0);在 XOR 的運算中,如果 mask 的 bit 是 1 則會顛倒;如果是 0 則不會顛倒,保持原值。

See also

&& (Boolean AND)
|| (Boolean OR)


語法參考主頁面

本頁由熱血青年 LBU 譯自英文版。

The text of the 86Duino reference is a modification of the Arduino reference, and is licensed under a Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain.