我们首先回顾 C/C++ 位逻辑运算符
和 &
或者 |
异或 ^
补充 ∼
使用真值表很容易看出这些运算符的作用。 为了说明真值表的工作原理,请考虑二进制加法的算法。 在第 3.1 节(第 66 页)中,我们看到结果中的第 i 位是一个数字的第 i 位加上另一个数字的第 i 位加上第 (i-1) 位相加产生的进位之和。 这个总和将产生零或一的进位。 换句话说,位加法器有三个输入——两个数字相加的两个对应位和前一个位相加的进位——以及两个输出——结果和进位。 在真值表中,每个输入和每个输出都有一列。 然后我们写下所有可能的输入位组合,然后在相应的行中显示输出。 位加法运算的真值表如图 3.3 所示。 我们使用符号 x[i] 来表示变量 x 中的第 i 位; x[i-j] 将指定位 i 到 j。
x[i] |
y[i] |
carry[(i-1)] |
z[i] |
carry[i] |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
1 |
0 |
1 |
0 |
0 |
1 |
0 |
1 |
1 |
0 |
0 |
1 |
0 |
0 |
1 |
1 |
0 |
0 |
1 |
1 |
0 |
1 |
1 |
0 |
1 |
0 |
1 |
1 |
1 |
1 |
1 |
1 |
上表:将前一个位相加的进位相加的真值表。 x[i] 是 x 的第 i 位; 进位 [(i-1)] 是添加第 (i-1) 位的进位。
位逻辑运算符作用于两个操作数的相应位,如下图所示。
上图:显示按位 C/C++ 运算的真值表。 x[i] 是变量 x 中的第 i 个位。
示例 3-m
让 int x = 0x1234abcd 。 用 0xdcba4321 计算与、或和异或。
解决方案:
x & 0xdcba4321 = 0x10300301
x | 0xdcba4321 = 0xdebeebed
x ^ 0xdcba4321 = 0xce8ee8ec
确保将这些按位逻辑运算符与 C/C++ 逻辑运算符 && 、|| 和 ! 区分开来。 逻辑运算符处理组织成整数数据类型的位组,而不是单个位。 为了比较,C/C++ 逻辑运算符的真值表如下图所示
上图:显示 C/C++ 逻辑运算的真值表。 x 和 y 是整数数据类型的变量。
|