C语言中|=,&=,~操作符的应用

       解释|=,&=,~

        我们在学习它们之前先了解一下它们吧,|=(或等)的解释是按位或赋值运算符,它主要的作用是计算一个数与另一个数或运算之后的结果。

        下表是或运算的运算规则(只要有一个元素为真,那么结果就为真)

元素1元素2结果

0

00
011
101
111

        &=(与等)的解释是按位与赋值运算符,它的主要作用是计算一个数与另一个数与运算之后的结果。

        下表是或运算的运算规则(只有两个元素都为真,结果才为真)

元素1元素2结果
000
010
100
111

        ~(取反)的解释是按位取反操作符,它的作用是对一个数的每个二进制位取反,就是把0变为1,把1变为0。

        题目练习

        好啦,前置知识就这些,我们来做一些练习吧,请听题:

        将13转换为二进制数是 00000000 00000000 00000000 00001101,现在杰克想要将1101中间的0转换为1,你帮帮他吧。

        题目分析

        我们根据题目了解到杰克想将一个数某个二进制位中0转换为1,我们通过前置知识了解到,想要将0转换为1只需要使用一个或运算,假设a=13,我们将a与1或等一下就可以得到,那么问题来啦,我们如何使1走到我们想要的位置呢,这个时候我们就需要将1左移一下啦,使用左移操作符<<将1移到与1101中0对齐的位置。之后进行或等运算,a|=(1<<1)。

        00000000 00000000 00000000 00001101

        00000000 00000000 00000000 00000001

        00000000 00000000 00000000 00000010

        代码表示

        我们来看看代码吧

        

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
	int a = 13;
	a |= (1 << 1);
	printf("%d\n", a);
	return 0;
}

        运行结果

        

        得到结果为15,与我们预期符合,15的二进制为

        00000000 00000000 00000000 00001111

        题目扩展

        扩展题目1

        那我们如果想将13的二进制数中的01101,最前面一位变为1怎么操作呢

        00000000 00000000 00000000 00001101

                                                                 

        这个时候我们想到,我们将1可以左移4位之后再与13进行或等运算,我们来看看

        代码表示

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
	int a = 13;
	a |= (1 << 4);
	printf("%d\n", a);
	return 0;
}

        运行结果

        

        结果验证

        我们得到结果为29,那么我们来验证一下

        00000000 00000000 00000000 00011101

        1*2^0+0*2^1+1*2^2+1*2^3+1*2^4=29

        结果正确

        题目再扩展

        题目分析

        那么我们可不可以再运算一下将之前改变的1再变回为0呢

        

        00000000 00000000 00000000 00011101

                                                                 

        我们想要将这一位再变为0,需要进行与操作,当1与0的时候,那么我们这一位就可以变回为0,有小伙伴要说啦,那么我们直接将29&0可不可以啊,不行!!!

        这里与我们之前的情况不一样,之前当我们将13|1的时候,是在一堆0里只有1,我们可以直接进行移位之后运算,这里就不行了,我们怎么可以在一堆0里找到0之后参与运算呢,这里我们就需要用到取反操作符了,既然我们可以在一堆0里找到1,那么我们将它们按位取反之后,不就是在一堆1里找0了嘛,然后我们将0再左移之后运算不就好啦。当然也不用担心改变其他位的数字,因为0&1之后还是0,1&1之后还是1。

        图解

       

        那么这里我们进行操作。

        代码表示

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
	int a = 13;
	a |= (1 << 4);
	printf("%d\n", a);
	a &= (~(1 << 4));
	printf("%d\n", a);
	return 0;
}

        运行结果

        与我们假设结果一致,计算无误。

        今天就到这里啦,加油!

&lt;think&gt;好的,我现在需要解释C语言中的&#39;|=&#39;运算符的含义。首先,我记得在C语言中有复合赋值运算符,比如+=、-=这些,它们的作用是将运算和赋值合并在一起。那&#39;|=&#39;应该也是类似的,但具体是哪个运算符呢? 根据用户提供的引用,特别是引用[5],里面提到&ldquo;|= 运算符用法示例讲解。复合赋值运算符 |= 的作用是将运算结果与原变量的值进行合并,相当于执行以下代码:a = a | b; [^5]&rdquo;。这说明&#39;|=&#39;是位或赋值运算符,结合了位或运算和赋值。所以,a |= b 等同于 a = a | b。 接下来,我需要确认位或运算符|的作用。位或运算符对两个整数的每一位进行逻辑或操作,只要其中一个位为1,结果位就为1。例如,如果a是二进制0101,b是0011,那么a | b的结果是0111。这样,使用&#39;|=&#39;就可以将a的值更新为原来的a与b按位或后的结果。 另外,引用[3]提到复合赋值运算符是将右侧表达式的结果赋给左侧变量。因此,|=的操作过程应该是先计算右边的表达式,然后与左边的变量进行位或运算,再将结果赋值给左边的变量。需要注意的是,复合赋值运算符的结合性是从右到左吗?但根据引用[1],赋值运算符的优先级很低,结合性是从右到左。不过,复合赋值运算符可能遵循同样的规则,但具体执行顺序是先运算右边再赋值。 还需要考虑的是,|=运算符的操作数类型应该是整数类型,比如int、char等,因为位运算通常用于整数。如果操作数是其他类型,比如浮点数,可能会导致编译错误。 举个例子,假设有int a = 5;(二进制0101),执行a |= 3;(二进制0011),结果a变成7(二进制0111)。这样用户可能更容易理解。 另外,用户提供的引用[5]中的示例代码是否正确?比如,a |= b是否等同于a = a | b?是的,根据引用[5],确实如此。所以,在解释时需要强调这一点,并给出例子。 总结起来,&#39;|=&#39;是一个复合赋值运算符,执行位或运算后赋值。使用时,左边的变量会被右边的表达式的结果进行位或运算,然后结果存回左边的变量。需要明确运算过程、操作数类型,并举例说明。&lt;/think&gt;C语言中的 `|=` 运算符是**复合赋值运算符**,它将**位或运算**和**赋值操作**结合,等价于先对变量执行位或运算,再将结果赋值给变量。具体形式为: $$a |= b;$$ 其等效代码为: $$a = a | b;$$ ### 分步解释: 1. **位或运算(`|`)**: 对两个操作数的二进制每一位进行逻辑&ldquo;或&rdquo;运算,只要某一位为1,结果位就为1。例如: - `5` 的二进制为 `0101` - `3` 的二进制为 `0011` - `5 | 3` 的结果为 `0111`(即十进制7)。 2. **赋值操作**: 将位或运算的结果赋给左侧变量。例如: ```c int a = 5; a |= 3; // 等价于 a = a | 3; 最终a=7 ``` ### 关键特性: - **操作数类型**:通常用于整数类型(如 `int`、`char`)。 - **优先级与结合性**:与 `=` 相同,优先级低(仅高于逗号运算符),结合性从右到左[^1]。 - **应用场景**:常用于对变量的特定位进行置1操作。例如,设置标志位: ```c flags |= 0x01; // 将flags的最低位设为1 ``` ### 示例代码: ```c #include &lt;stdio.h&gt; int main() { int a = 5; // 二进制 0101 int b = 3; // 二进制 0011 a |= b; // a = 0101 | 0011 = 0111 (十进制7) printf(&quot;%d\n&quot;, a); // 输出7 return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值