位元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.