学途的踉跄~Top 1 (关于按位操作符的那些事)

我们是否曽因为一时的失败而自责,陷入无言的自卑?我们是否也曾再一次挺身站起,却又被当头一棒狠狠地打翻在地?我们是否也曾劝说自己内心那颗不屈的内心放下那份热忱,放弃那份持久的坚守?我们是否……

但问耕耘,莫问归期”。学途尚知道阻且艰,一旦认定那是自己所憧憬一切的开始,那就一定要不顾一切走下去。即便那现实或许落下冷笑,嘲弄我们所追寻的那荒诞的做法,即便那最后,“鬓微霜”,外表的老化以及内心的麻木。但至少,也曾为之挥下泪水和汗水。

继续向前吧!行路人~

                                                                                                                                         ———前言

对于我而言,在C语言操作符的学习中,令我困惑难解的,莫过于“按位”操作符。然而,它却从未对我感到的困苦,施加些许“安慰”。

在本篇,我想借以通过位运算 设定某二进制序列的某位数为0 或 1 的方式,并进行回顾~

目录

1.&、^、| 三胞胎~:

2.&& 、|| :

3.<<  与  >> 操作符:

4.把特定的二进制序列的位数,设置为1:

 重难点1:为什么要左移动n-1位?

难点2:怎么打印二进制序列:

①为什么num的值要-1?

②为什么在while的条件判定中,num>=0?

③关于if括号内的运算是怎样进行的?

 5.把特定的二进制序列的位数,设置为0:

总结 :


问题1:设定制定位数为1

问题2:把制定位数清0

1.&、^、| 三胞胎~:

①&:按位与 (仅仅在把“0”看成假,“1”,看成真的时候,理解为“且”)

②|: 按位或(仅仅在可以在把“0”看成假,“1”,看成真的时候,理解为“或”

③^:按位异或(相同为0,相异为1--->这里可以记谐音!) 

 在简单回顾了 “三胞胎”怎样操作,怎样进行运算后。我们要区别一下分别他们与另外的他们的区别。

2.&& 、|| :

这个虽然不是本篇的重点,但也值得提一提。

&&与|| 仅仅出现在逻辑判断语句之中。而^、|、& 是作为数值运算存在,两者存在根本上的差异。

3.<<  与  >> 操作符:

①左移操作符:<<

顾名思义,就是把数据在内存中二进制序列的补码,整体向左移动,去掉最高位,后面补0

②右移操作符:>>

也是顾名思义, 就是把数据在内存中二进制序列的补码,整体向右移动,但也有所区别:

被操作数:

无符号数(%u):进行逻辑右移:

                       最高位补0

如果不信,我们可以用计算机检验:

哇哦~计算机真神奇呀~!

有符号数: 进行算术右移:

                最高位补符号位

 现在我们就讲完啦~

废话不多讲,进入本篇核心问题的分析~

4.把特定的二进制序列的位数,设置为1:

  注:这个问题会牵涉到宏定义,但不会有考虑宏是怎样定义的,只需要弄清怎么运算即可~

在分析这个问题时,我们首先要明白怎样才能得到1:

即在0与1中,进行怎样的位运算可以得到1!!

由上面的可知,我们可以选择 “|”,进行对已知数的特定为1; 

我们可以看出,假如我们就像把数据0的最后一位(1)设置成1,仅需要 同 (1<<n-1)

根据这个思想,要设定第n位的数为1 ,只需要和 | (1<<n-1) 即可~ :

 重难点1:为什么要左移动n-1位?

据图,如果我们要数移动到我们想要的二进制序列n位上,只需要让1 <<n-1 即可~ 

我们进行这个操作后,至于对不对一定需要知道结果:

难点2:怎么打印二进制序列:

 怕你们觉得我乱开黄腔,代码结果在下奉上:

我们可以直观地看到,n数字的 2   15    32 位置的0值,被替换成了1,而且其余的位数并没有改变

要理解如何打印有三个难点,以如上述图明显标识了出来:

①为什么num的值要-1?

②为什么在while的条件判定中,num>=0?

③关于if括号内的运算是怎样进行的?

 首先我们来说说第一个问题:

num创建出来是干嘛的~

其一:num是为了记录函数外面 x的类型有几个比特位

其二:num与宏定义的n一样,是为了打印出,X的二进制序列里有多少个字符“1”

 所以:  num-1

 于是乎只剩下最后一个问题:

为什么num>=0?

我们不妨假设,当num=0时;

此时是拿X的最后一位 ,与1按位与(&)可以得出 X 的最后一位是 “1” ,还是 “0”;

由此,我们可以说,没有num=0的条件,我们吴所知道,X最后一位的具体值,即便我们设置了它为“1”:

结果如下:请诸位自己看看

num>=0: num>0:

 接下来我们就开始第二个核心问题,有了上面的基础,分析下面的第二个核心问题就相对容易一些

 5.把特定的二进制序列的位数,设置为0:

在此之前,还是先提一个问题,用什么位运算,可以让1 与 0 或  1 按位运算成 0?

 因此,用"&"是我们首当其冲的选择。

借此代码可以改为如下:

这是我们对宏定义的思想:

宏定义:         

特意把两种写法写到一起,方便区分。     注:宏定义不要怜惜括号,否则可能会出现运算错误

附:~ :取反。包括符号位在内,1变0 ,0 变1。

 接下来,我们就可以实现我们想要的效果啦~

总结 :

①“三胞胎”各自怎样使用以及相应的应用场景(这次没讲^操作符,希望以后会提到)

②&&、||同& |他们之间的区别

③<< 只管 补0 与  >> 考虑类型的性质(需要注意,因为时间有限,类型的性质决定运算的方法!!)~ ‘’

④刚开始接触很难,接触一段时间还是难,所以,还是要多接触呀~

感谢您的阅读,祝你好运~

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值