00:00
行,这个毕竟呢,咱们后边讲这个微运算符用的还比较少啊,所以呢,既然说到这儿了,咱们这个除了这个面试题之外啊,咱们再来谈一个小的练习啊,以后呢,其实用到的机会就很少了,这个练习的话呢,看看这样的一个需求啊,说我现在呢有两个数。啊,这个一个呢叫M是啊,上面定义过M了哈,我定一个叫NUMBER1吧,这个呢值是十。第一个NUMBER2呢,这个值是20。现在我希望呢,通过一段代码啊,你就在下边写代码,写完以后呢,实现就是这两个数值的一个交换。所以我们这个需求呢,其实就是交换两个变量的值。哎,这呢,实际上是一个非常典型的一个需求,咱们在开发当中其实经常会用到。我给你举例子啊,比如说大家这个快过年了,你需要登录这个1230呢去买票啊,大家之前呢来的,来北京的时候呢,你这个目的地呢,这写的是北京啊,你可能是从其他的城市来的,比如说呢,是从这个唐山来的。
01:07
哎,那这时候呢,你是这样子过来的这种啊,哎,然后的话呢,现在要回家了,你会发现在这两个位置呢,它有一个小的按钮。它那个按钮可能长长这个样子吧,哎,你一点那个按钮,它就诶自动的就把这量给净化了。这不就是相当于交换两个变量的值吗?只不过这时候呢,我们是死锥形的。啊,这呢,我是用int型的为代表说明的啊,这是一个,还有呢,就是咱们呢,前面也稍微提到过,讲那个数据结构加算法等于程序的时候提过,说我们这呢,比如叫15423吧,我现在呢,想让你把这个一串数呢,给它从小到大去排列啊,排列成12345,在这里边呢,肯定少不了让你去交换两个位置变量的值。比如说你发现这个五比较大啊,我让这个五跟三交换一下,这不五就跑这了,三就跑这了。哎,像这呢,都是需要这个你去交换变量值这个操作的。
02:01
啊,像这呢,这是我们说典型的排序了,那排序呢,又是我们平时开发当中见的最多最多的一种操作了,再从算法层面来讲啊,行,那也就是说呢,这个操作是大家呢必须要掌握的啊那下面呢,我们看一下咱们怎么去交换两个变量的值啊,有几种不同的方法。首先,我们先说一种最通用的方式。对,怎么做呀。哎,这个大家的想法是对的,定义一个临时变量是吧,哎,很简单的道理,比如说哎,我这有个杯子,我这里边是水,哎,或者我我发到大家屏幕上吧,哎,我这有个杯子,我这放在呢是水,这呢有个杯子放那是雪碧。现在呢,我想让这两个杯子里边这个,呃,这个这个液体交换一下。那你不能把这个倒到这里边儿,然后你再倒回来一半,说这个就叫换,很骗人的,属于是吧,哎,那这时候呢,咱们通常的想法不就是拿一个空杯子呗,把这个倒过去。
03:03
把这个倒过来。把这个再倒下去是不是就可以了。啊,那这呢,就相当于咱们这个NUMBER1。这是NUMBER1,这呢是NUMBER2。这呢是我们临时定了一个变量,比如说习惯上咱们都叫做碳法临时的变量。好,那第一步。啊,你看我们把这个步骤说完以后,咱们就得写代码了,第一步我们先把这个数据是不是先复制给他,得先过去,然后第二步呢。第二步,你你能马上就拿这个付过来吗?不能你这样一付过来,这个雪这个雪,呃,雪碧这个或者你是个数,这不就直接被覆盖了啊,所以第二部呢,一定是这个。紧接着赶紧把你这个数据呢给复制给他,把原来你这个数据呢覆盖掉。啊,然后呢,因为你之前呢,已经提前把这个数据水的这个数据给他了,我再把这个呢,再整过来,这是第三步。
04:02
行,现在脑子里边大家浮现这个图,下边呢,咱们来写这个代码啊,好我就清了来,首先呢,我们第一个。哎,临时变量我叫做tap,将我们这个NUMBER1的值付过来,就刚才说的这一条线,然后下一步。把这个number是不是给了NUMBER1,对给了NUMBER1 number2给。好,第三步。PA,把这个数呢,是不是给了我们的NUMBER2呗?哎,这呢,就实现了一个交换。啊行保存一下啊,那在这呢,我们也是先做一个输出。哎,说我这个NUMBER1等于。哎,NUMBER2等于哎保存,然后呢,当我们交换完以后,我再去输出看看呢,是不是真的给他交换了。
05:01
来保存一下啊,来测试。编译变形,看原来呢是12时,他现在变了20时。哎,这就OK了啊行,哎这种方式呢,其实是我们用的最多的一种方式啊,哎这呢,我们称为叫定义临时变量。哎的这个方式啊。好,这样呢是一种方式,那现在呢,我们再看看还有没有其他的方式。哎,还有没有其他的方式。左移右移能做啊。唯有一不行了是吧?嗯。哎,这个呢,其实还是挺难想到的啊,这种方式呢,大家最容易想到,但是这种方式呢,确实也是我们最通用的啊,然后这个方式二呢,哎,那我再举一个情境,那就是这样的,比如说现在呢,大家站在这个一个小岛上啊,这个岛呢足够小,只能让你放下你的两只脚。
06:09
啊哎,这呢也是一个小岛啊,也是只能放下两只脚,这个人呢叫甲,这个人呢叫乙,就只能够够站着脚的这个位置啊,然后这块呢,就是好多这个水。或者或者是深渊也行是吧,嗯,就是有鳄鱼在这来回跑是吧,现在呢,要求就这俩人呢,交换一下位置。你说呢,这个再整一块倒没有了,就这俩。怎么交换位置?这个你不能说,这个一碰过来是只能立住一双脚。哎,这时候怎么办啊,我可以让这个甲呢跳到这个乙的这个脖子上,先背上它是吧,然后这个乙呢跳过来,这个甲呢,再再再再跳下去。就可以了啊,这也是一个想法是吧,那这种想法呢,要是用咱们代码来实现,这个甲跳到他脖子上,这个你怎么去用代码去描绘这个事情,这就是把它加一起是吧?哎,那这呢,我们就因为这时候你看我们就不用定义临时的一个小岛或一个变量了啊哎,我就让这个NUMBER1,哎加上这个NUMBER2。
07:18
加的这个和呢,不妨呢,我就给了NUMBER1了。哎,那这时候呢,你心里边有数哈,这个时候其实这个NUMBER1已经是30了,然后呢,哎,我让这个30减去NUMBER2。那么二这时候是20是吧?30减去20。十是吧,你把这个十给谁对给他。哎,这时候NUMBER2已经是十了啊,而我们这个NUMBER1呢,还是30,让他来减去NUMBER2。是不是30减去十是20呢?把这20呢,再给到NUMBER1。有点意思是吧,哎,这就写好了,哎,写好以后呢,记得把这个注释掉啊,这个注释掉了,然后我们再测一下这个方式呢,现在对不对,保存测试。
08:05
编译运行啊也可以。啊也可以啊行,那这时候呢,大家先对比一下这个方式一跟二,你觉得哪个好。一为啥一好简单啊,就二上的话,感觉这有点太吃这个智商了是吧?嗯,对这两个的话呢,我们看怎么讲啊,如果从这个容易上手容易理解的角度来讲,这个要好一些是吧。如果你要说他好呢,这个你好歹给一个好处。对,这个呢,是不是就不用再定义这个临时变量了是吧,哎,这也就是你要给个好处,这也算它这个比较节省内存空间啊,不用你再去额外的再开辟一个空间了。嗯嗯,当然这些呢,其实都是一些小事,就是呢,你说这个简单呀,这个复杂呀,这个开个变量啊,其实都没多大。
09:02
最主要的一个原因,我们为什么还要选择一呢?因为它有弊端。想想他有什么弊端?哎,对啊,有同学提到了形成有好处,就不用定义啊,临时变量啊,这是它的一个好处啊,它的这个弊端。B端呢,大家刚才提到一个,就有可能你这个NUMBER1 number1加的话呢,可能会超出你这个的范围是吧。就像这两个人那个坐到那个人头上,假设这有个房顶,这俩人那个一骑上去之后呢,这个超了房顶了,那那不能跳过去是吧。也就是说呢,有可能你这个相加完以后呢,这个数据得到这个值呢,超出本身你这个变量的这个存储范围啊,也就是说呢,就是相加。操作啊,可能超出。
10:00
啊,这个存储范围,当然这呢还是一个次要的,因为大部分情况下都超不了,还有一个更要命的。它呢有局限性。对,你看我们这是不是加减,是不是只能是这种数值型的呀,说刚才咱们这这是唐山,这是北京,你你你给他加一下,加倒是可以算是一个连接了,那你减呢。哪有呀?对,就是这时候呢,对于这个数值型的话呢,可以用,但是你要非数值型呢,就不好使了。而这个呢?这个有数据类型的限制吗?没有啊,你是叉型啊,布尔型啊,什么类型都可以。哎,这个呢就具有通用性啊,从这两个角度来讲呢,大家呢就更是要用它了,这是一个推荐的方式啊,而且呢还简单是吧,好理解啊。像这呢,是有一个局限性啊,只能适用于这个数值类型啊。啊,那这两种呢,这都跟咱们这个讲的这个微运算符呢,没有任何关系了,那咱们呢,再写一个微运算符的啊。
11:10
哎,使用位运算符。哎,这个呢,那就更难想到这个问题了。啊,这个更难想到了,这我就直接来讲了啊,我在这个PPT里边呢,放了一个图啊,就是这个不是这个这个图,这就需要我们记录这样的一个事实,什么事实看一下这个呢,我们比如是M是13 N呢是五,我这呢叫异或,哎我们这会也讲过了,异或是什么意思了啊,哎,就是当它俩一样的话呢,就零。对,像这种啊好这呢,我们得到一个结果呢,是一个八,这个八呢,我们把它记作是一个K啊,那我们现在想说的是这个事,我们让M1或上N得到一个K,我让那个K呢,再接着去抑或其中的一个数。不妨呢,我用N。那这个K再去一或N以后啊,还是这样去运算,结果你会发现呢,诶又变成M了。
12:07
哎,我们就记住这样一个事实,就是我下边写了一个公式哈,就是M或上N。得到这个结果呢?你再跟N去,抑或我就会又得到M。其实你不就是变过去,然后又一会又变回来了吗?就这个意思啊,好,那我们就借助这个关系式来说一下啊,那我们呢,让。这个NUMBER1他呢,去抑或一下NUMBER2,得到这个结果,我再去抑或一下NUMBER1。你想这时候呢?这到底是谁啊?得到的是NUMBER2是吧,嗯。我看看啊,我们这样吧。先这么着啊,呃,这个NUMBER11或者NUMBER2,我这个呢,就让它继承是一个NUMBER1先。先这样啊。然后呢,我让得到的这个结果NUMBER1,再去抑或一下NUMBER2。
13:04
这个就没有必要加这个小括号了。这个脑子清醒啊,看着他这个结果呢,付给NUMBER1的,我让这个NUMBER1呢跟这个呃NUMBER2呢去一货,按说呢,结果该是。NUMBER1了,但是我把这个结果付给NUMBER2。嗯。实际上是NUMBER1,但把NUMBER1的值啊给了NUMBER2了,然后呢,我上面这个,我这个NUMBER1还是你这个这个这个数据啊,我让他呢,再去抑或一下NUMBER2。这个number呢,实际上是你原来的NUMBER1的值。那你这个E上NUMBER1的值是不是就事实上得到原来NUMBER2的值了,我把它给了number。At。嗯,就是事实上你得到是原来那个NUMBER2的值,我给了NUMBER1,这不就行了。你看这这就这样写啊。这个比他好像更难是吧。
14:01
哎,不明白不明白就对了,因为咱们基本上不怎么用嘛。嗯,行,这样呢,就是使用微运算符了啊,这个下来呢,你要想看看就看看,就是这个相较于方式二呢,其实也算是有一个好处啊,就是把这个弊端给解决了。哎,你这个相加可能会超我这一货肯定超不了了,哎,那但是呢,仍然也是有局限性的哈,它呢也只能适用于这种数值类型,因为咱们这个位算符呢,只能够适用于这个数值类型。啊,那这个呢,也很难理解啊,所以呢,咱们开发的时候呢,肯定大家呢,想到这个做这个交换预算的时候,即使是数值型的也基本上不会用它啊,所以大家呢,就这样用就行。哎,就这样去写啊。行这呢,就是我们通过这个呃,交换这个变量值的这样的方式啊,给大家说了一下,我们后边经常用的一个操作啊,以及呢,这里边儿用的一下这个微运算符。
15:01
啊,那为什么说我们开发中用未算数比较少呢?就是因为他的这些操作呢,通常我们可以想别的方式去做。所以呢,我们就基本上也很少用它了啊。
我来说两句