C语言中的位级运算、逻辑运算和移位运算 您所在的位置:网站首页 c语言中按位运算 C语言中的位级运算、逻辑运算和移位运算

C语言中的位级运算、逻辑运算和移位运算

2024-06-03 19:22| 来源: 网络整理| 查看: 265

C语言中的位级运算、逻辑运算和移位运算 位级运算

​ C语言的一个很有用的特性就是它支持按位布尔运算。事实上,我们在布尔运算中使用的那些符号就是C语言所使用的:|就是OR (或), &就是AND (与), ~就是NOT (取反),而^就是EXCLUSIVE-OR (异或),这些运算能运用到任何“整型”的数据类型上,也就是那些声明为char或者int的数据类型,无论它们有没有像short. long、long long或者unsigned这样的限定词。以下是一些对char数据类型表达式求值的例子。

在这里插入图片描述 布尔运算

​ 位级运算的一个常见用法就是实现掩码运算,这里掩码是一个位模式,表示从一个字中选出的位的集合。让我们来看一个例子,掩码0xFF (最低的8位为1)表示一个字的低位字节。位级运算x&0xFF生成一个由x的最低有效字节组成的值,而其他的字节就被置为0。比如,对于x=0x89ABCDEF,其表达式将得到0x000000EF表达式~0将生成一个全1的掩码,不管机器的字大小是多少。尽管对于一个32位机器来说,同样的掩码可以写成0xFFFFFFFF,但是这样的代码不是可移植的。

逻辑运算

​ C语言还提供了一组逻辑运算符||、 &&和! ,分别对应于命题逻辑中的OR,AND和NOT运算。逻辑运算很容易和位级运算相混淆,但是它们的功能是完全不同的。逻辑运算认为所有非零的参数都表示TRUE,而参数0表示FALSE.它们返回1或者0,分别表示结果为TRUE或者为FALSE。以下是一些表达式求值的示例。

表达式结果!0x410x00!0x000x01!!0x410x010x69&&0x550x010x69||0x550x01

可以观察到,按位运算只有在特殊情况下,也就是参数被限制为0或者1时,才和与其对应的逻辑运算有相同的行为。 逻辑运算符&&和||与它们对应的位级运算&和|之间第二个重要的区别是,如果对第一个参数求值就能确定表达式的结果,那么逻辑运算符就不会对第二个参数求值。 因此,例如,表达式a&&5/a将不会造成被零除,而表达式p&&*p++也不会导致间接引用空指针。

举个栗子:

假设x和y的字节值分别为0x66和0x39. 填下表,指明各个C表达式的字节值.

表达式值x & yx | y~x | ~yx & !yx && yx || y!x||!yx && ~y 注意:C语言中的逻辑运算非零参数都是为1,即TRUE;而参数零表示FALSE,他们只会返回1和0.

答案:

表达式值x & y0x20x | y0x7F~x | ~y0xDFx & !y0x00x && y0x01x || y0x01!x||!y0x00x && ~y0x01

再来个小练习:

只使用位级和逻辑运算,编写一个C表达式, 它等价于 x==y. 换句话说, 当x和y相等时它将返回1,否则返回0.

答案:

表达式: !(x^y)

当且仅当x的每一位和y相应的每一位匹配时, x ^ y 等于0,然后利用!来判定一个字是否包含任何非零位.

移位运算

C语言中的移位运算

​ C语言还提供了一组移位运算,以便向左或者向右移动位模式。对于一个位表示为[xn-1 , xn-2 ,… ,x0 ]的操作数x,C表达式 x



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有