布林運算
“位” (
bit) 是我們能想象到的最小資訊量單位,因為它只能儲存 1 或 0 兩個值中的一個,用來表示“是”或“否”、啟用或未啟用、真或假等等……也就是說:兩種可能的狀態,每種狀態都與另一種相反,沒有任何中間狀態。我們將認為一個位的兩種可能值是 0 和 1。
位可以進行多種運算,既可以與其他位一起運算,也可以單獨運算。這些運算被稱為
布林運算,這個詞來源於對該領域貢獻最大的數學家之一:喬治·布林 (George Boole, 1815-1864)。
所有這些運算都有既定的行為,並且都可以應用於任何位,無論其包含的值是 0 還是 1。下面列出了基本的布林運算,並附有一個表格,說明了該運算在所有可能的位組合下的行為。
與 (AND)
這個運算在兩個位之間進行,我們稱之為
a和
和 b。應用“與”運算的結果是:如果兩個位
a和
和 b都等於 1,則結果為 1;在所有其他情況下(即,如果其中一個或兩個變數為 0),結果為 0。
與 (&)
或 (OR)
這個運算在兩個位(
a和
和 ba 和 b)之間進行。如果兩個位中任意一個為 1,或者兩個都為 1,則結果為 1。如果兩個都不等於 1,則結果為 0。
或 (|)
異或 (XOR, Exclusive Or)
這個運算在兩個位(
a和
和 b這個運算在兩個位(a 和 b)之間進行。如果兩個位中只有一個為 1,則結果為 1,但如果兩個都為 1 則不是。因此,如果兩個位都不為 1 或者都為 1,則結果為 0。
異或 (^)
非 (NOT)
這個運算在單個位上進行。其結果是該位當前值的反轉:如果它被設定為 1,就變成 0;如果它是 0,就變成 1。
非 (~)
以上是 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 和 b
a和
和 b:
最右邊的位進行“與”運算的結果。同樣的操作也將在兩個變數的第二個位、第三個位之間進行,依此類推,直到對兩個變數的所有位都完成運算(每個位只與另一個變數的對應位運算)。
c
c的最終二進位制值是 01000011,即十進位制數 67。所以,
195&87c 等於 67。
67.