布尔运算
位(bit)是我们定义的最小信息单位,因为它只包含值1或0,这两个值代表是或否,
activated或deactivated, 真(true)或假(false)等等。也就是说:两种可能的状态,
每一种都是相对的,没有任何模糊。我们要考虑的一个位的两个可能的值是0和1。
一些操作可以用位来执行,可以与其他位一起执行,也可以单独执行。
这些运算被称为布尔运算,这个词来自于一位数学家的名字,
他对这个领域做出了更多的贡献:乔治布尔(1815-1864)。
所有这些操作都有一个既定的行为,所有这些操作都可以应用于任何位,
无论它们包含哪个值(0或1)。下面是一个基本布尔运算的列表和一个包含该运算行为的表,
以及每个可能的位组合。
☲ AND(与)
这个操作在两个比特(a和b)之间执行。
如果a和b都等于1,结果是1,否则结果是0。
AND (&)
a |
b |
a&b |
0 |
0 |
0 |
0 |
1 |
0 |
1 |
0 |
0 |
1 |
1 |
1 |
☲ OR(或)
"或"在两个比特(a和b)之间执行。如果两个比特中有一个是1,或者两个都是1,则结果是1。
否则结果是0。
OR (|)
a |
b |
a|b |
0 |
0 |
0 |
0 |
1 |
1 |
1 |
0 |
1 |
1 |
1 |
1 |
☲ XOR(逻辑或)
这个操作在两个比特(a和b)之间执行。
如果a和b不相等,则结果是1,否则结果是0。
XOR (^)
a |
b |
a^b |
0 |
0 |
0 |
0 |
1 |
1 |
1 |
0 |
1 |
1 |
1 |
0 |
☲ NOT(非)
该操作在单个位上执行。它的结果是位的实际值取反:
如果它被设为1,它就变成0,如果它是0,它就变成1:
NOT(~)
这是4个基本的布尔运算(AND, OR, XOR和NOT)。结合这些运算,我们可以从两个比特中得到任何可能的结果。
在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之间进行了位AND运算。该操作在位于同一位置的两个变量的位之间执行:
c的最右边的位将存储a和b的最右边的位执行AND操作的结果:
同样的操作也在两个变量的第二位和第三位之间执行,以此类推,
直到两个变量的所有位之间执行操作(每个变量只与另一个变量的相同位)。
c的最终二进制值是01000011,即十进制的67。195&87等于67。