布尔运算
“位” (
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.