布尔运算

“位” (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.