C++官网参考链接:Boolean Operations - C++ Tutorials (cplusplus.com)
布尔操作
位是我们可以想象的最小信息量,因为它只存储值1或0,代表是或否、激活或失效、真(true)或假(false),等等……也就是说:两种可能的状态,每一种都相对于另一种,没有任何阴影的可能性。我们将考虑一个位的两个可能值是0和1。
一些操作可以与位一起执行,或者与其他位一起执行,或者单独执行。这些操作被称为布尔操作,这个词来自于一位对该领域贡献较大的数学家的名字:乔治·布尔(1815-1864)。
所有这些操作都有既定的行为,它们都可以应用到任何位上,无论它们包含哪个值(0或1)。接下来,你有一个基本布尔操作的列表,以及一个包含该操作行为的表,其中包含所有可能的位组合。
按位与
这个操作在两个位之间执行,我们将称之为a按位与b(a&b)。如果a和b都等于1,应用这个按位与操作的结果是1,在所有其他情况下(即,如果一个变量或两个变量都是0),结果是0。
按位与(&)
a | b | a&b |
---|---|---|
0 | 0 | 0 |
0 | 1 | 0 |
1 | 0 | 0 |
1 | 1 | 1 |
按位或
该操作在两个位(a和b)之间执行。如果两个位中有一个为1,或者两个都为1,则结果为1。如果没有一个等于1,则结果为0。
按位或(|)
a | b | a|b |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 1 |
按位异或
该操作在两个位(a和b)之间执行。如果两个位中有一个为1,则结果为1,但如果两个都为1,则结果不为1。如果它们都不等于1或都等于1,则结果为0。
按位异或(^)
a | b | a^b |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
按位非
该操作是在单个位上执行的。它的结果是位的实际值的反转:如果它被设置为1,它就变成0,如果它是0,它就变成1:
按位非(~)
a | ~a |
---|---|
0 | 1 |
1 | 0 |
这是4个基本的布尔操作(按位与、按位或、按位异或和按位非)。结合这些操作,我们可以从两个位中得到任何可能的结果。
在C++中,这些操作符可用于任何整数数据类型的变量;布尔操作是对每个相关变量的所有位执行的。例如,假设有两个变量:a和b,都是unsigned char类型,其中a包含195(二进制中的11000011),b包含87(二进制中的01010111)。如果我们写以下代码:
unsigned char a=195;
unsigned char b=87;
unsigned char c;
c=a&b;
这意味着,我们在a和b之间进行了一个按位与操作。该操作在位于相同位置的两个变量的位之间执行:c的最右边的位将包含在a和b的最右边的位之间进行按位与(&)操作的结果:
同样的操作也在两个变量的第二个位和第三个位之间执行,以此类推,直到在两个变量的所有位之间执行该操作(每个位只使用另一个变量的相同位)。
c的最终二进制值是01000011,即十进制67。195&87=67。