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;
}

        运行结果

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

        今天就到这里啦,加油!

  • 30
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值