布林運算

“位” (bit) 是我們能想象到的最小資訊量單位,因為它只能儲存 1 或 0 兩個值中的一個,用來表示“是”或“否”、啟用或未啟用、真或假等等……也就是說:兩種可能的狀態,每種狀態都與另一種相反,沒有任何中間狀態。我們將認為一個位的兩種可能值是 0 和 1。

位可以進行多種運算,既可以與其他位一起運算,也可以單獨運算。這些運算被稱為布林運算,這個詞來源於對該領域貢獻最大的數學家之一:喬治·布林 (George Boole, 1815-1864)。

所有這些運算都有既定的行為,並且都可以應用於任何位,無論其包含的值是 0 還是 1。下面列出了基本的布林運算,並附有一個表格,說明了該運算在所有可能的位組合下的行為。

與 (AND)

這個運算在兩個位之間進行,我們稱之為a和 b。應用“與”運算的結果是:如果兩個位a和 b都等於 1,則結果為 1;在所有其他情況下(即,如果其中一個或兩個變數為 0),結果為 0。

與 (&)

a和 ba&b
000
010
100
111

或 (OR)

這個運算在兩個位(a和 ba 和 b)之間進行。如果兩個位中任意一個為 1,或者兩個都為 1,則結果為 1。如果兩個都不等於 1,則結果為 0。

或 (|)
a和 ba|b
000
011
101
111

異或 (XOR, Exclusive Or)

這個運算在兩個位(a和 b這個運算在兩個位(a 和 b)之間進行。如果兩個位中只有一個為 1,則結果為 1,但如果兩個都為 1 則不是。因此,如果兩個位都不為 1 或者都為 1,則結果為 0。

異或 (^)
a和 ba^b
000
011
101
110

非 (NOT)

這個運算在單個位上進行。其結果是該位當前值的反轉:如果它被設定為 1,就變成 0;如果它是 0,就變成 1。

非 (~)
a~a
01
10

以上是 4 種基本的布林運算(與、或、異或和非)。透過組合這些運算,我們可以從兩個位中獲得任何可能的結果。

在 C++ 中,這些運算子可以用於任何整數資料型別的變數;布林運算會對所涉及的每個變數的所有位進行操作。例如,假設有兩個變數a和 ba 和 b,型別都是unsigned char,其中aa 包含 195(二進位制為 11000011),和 bb 包含 87(二進位制為 01010111)。如果我們編寫以下程式碼:

1
2
3
4
unsigned char a=195;
unsigned char b=87;
unsigned char c;
c=a&b;

這意味著,我們在a和 ba 和 b 之間進行了一次按位與運算。該運算在兩個變數中處於相同位置的位之間進行:c的最右邊的位將包含對 a 和 ba和 b:


最右邊的位進行“與”運算的結果。同樣的操作也將在兩個變數的第二個位、第三個位之間進行,依此類推,直到對兩個變數的所有位都完成運算(每個位只與另一個變數的對應位運算)。

cc的最終二進位制值是 01000011,即十進位制數 67。所以,195&87c 等於 67。67.