C 语言中的位级运算
C 语言的一个很有用的特性就是它支持按位布尔运算。事实上,我们在布尔运算中使用的那些符号就是 C 语言所使用的:| 就是 OR( 或),&就是 AND( 与),~就是 NOT(取反),而^就是 EXCLUSIVE-OR( 异或)。这些运算能运用到任何“整型”的数据类型上。以下是一些对 char 数据类型表达式求值的例子:
正如示例说明的那样,确定一个位级表达式的结果最好的方法,就是将十六进制的参数扩展成二进制表示并执行二进制运算,然后再转换回十六进制。
位级运算的一个常见用法就是实现掩码运算,这里掩码是一个位模式,表示从一个字中选出的位的集合。让我们来看一个例子,掩码 OxFF( 最低的 8 位为 1) 表示一个字的低位字节。位级运算 x&OxFF 生成一个由 x 的最低有效字节组成的值,而其他的字节就被置为 0。比如,对于 x= Ox89ABCDEF,其表达式将得到 Ox0000 00EF。表达式 ~0 将生成一个全 1 的掩码,不管机器的字大小是多少。尽管对于一个 32 位机器来说,同样的掩码可以写成 OxFFFF FFFF,但是这样的代码不是可移植的。
C 语言中的逻辑运算
C 语言还提供了一组逻辑运算符 II、&& 和 !,分别对应于命题逻辑中的 OR、AND 和 NOT 运算。逻辑运算很容易和位级运算相混淆,但是它们的功能是完全不同的。逻辑运算认为所有非零的参数都表示 TRUE,而参数 0 表示 FALSE。它们返回 1 或者 0,分别表示结果为 TRUE 或者为 FALSE 。以下是一些表达式求值的示例。
可以观察到,按位运算只有在特殊情况下,也就是参数被限制为 0 或者 1 时,才和与其对应的逻辑运算有相同的行为。
逻辑运算符 && 和 || 与它们对应的位级运算&和 | 之间第二个重要的区别是,如果对第一个参数求值就能确定表达式的结果,那么逻辑运算符就不会对第二个参数求值。因此,例如,表达式 a&&5/a 将不会造成被零除,而表达式 p&&*p++ 不会导致间接引用空指针。
网友评论