00:00
好,那么第四类运算符呢,就告一段落,接下来看第五类叫未运算符啊,这儿呢是一个难点啊,同时呢,还不是个重点啊,就是确实有点难,所以呢,大家呢,在刚开始学习的时候呢,这个运运算符呢,咱们作为整体来讲解运算符,呃,咱们还是要讲一下的,但是呢,大家一定不要把它当成重点。啊,后边的话呢,我们遇到集合看源码的时候呢,我们会再次遇到这些运算符,到时候的话呢,我们再给大家说一下,在实际什么样的场景下呢,我们去用,诶暂且的话呢,我们也就了解一下这些符号它是怎么使用的也就可以了。好,首先呢,来看一看都有哪些位运算符,这呢就罗列的罗列出来了,这些符号的话呢,我们大体要分的话呢,其实可以也分成两波啊,这算一波,然后下边这算一波。上面呢,这三个人看长得就很像,嗯,首先呢,我们先明确,它针对的都是数值类型的。啊,这一下的话呢,就能够区分出来,我们刚才讲这个逻辑运算符的时候呢,是不是有这三个呀。
01:00
这三个啊,这个有同学以前问过啊,说呃,说这个老师我这个我怎么去区分这个符号到底是呃未运算符的与,还是说逻辑运算符的那个与呢。你就看你左右两边这个类型。哎,如果要是数,那就是位。运算符,你要是这个布尔类型呢,这就是逻辑运算符是吧。就这么简单啊。好,那么具体来讲看什么意思呢?这个符号,这个符号啊,这个符号它就涉及到叫左移或者是右移的操作了。啊,你像三左一,注意咱们看到的都是十进制,那么对于计算机来讲呢,全都是二进制啊。咱看到的跟计算机实际它存的呢,它是不一样的,哎,那么二进制的情况下呢,你往它左移两位,得到的结果还是一个数,右移呢也是数啊,所以结果也是个数。具体的规律一会儿说,然后这个与或异或取反啊,这个结果呢,也是针对这个数值类型,结果也是个数。啊,就是这样的逻辑,那么关键呢,就是我们要看看诶这个左移右移是一个什么样的逻辑,OK。
02:05
回过来。新建一个。这个呢,为啊为我就要beat了啊,关于它这个测试了。CTRLCCTRLSCTRLV。啊,这个我,哎。用一下这个啊。好测试运算符的使用。五未运算符。第一个问题。哎,有哪些为运算符。左一。右移无符号右移没有无符号左移啊。哎,这个也没有,就这仨,然后呢,关于刚才提到有这个,呃,这叫雨是吧,或。也有一个,抑或还有一个去反。哎,就有这样一些符号,然后这些符号里边呢,咱们先来说明一下。呃,前边的这仨。
03:01
啊,这三个里边我们先说一下前两,前两里边我们先说一下第一个啊,OK,嗯,那针对的都是这个数值了,那咱们就举个例子吧。啊,Int型的一个叫NUMBER1,比如这个值呢,我是七。好,然后呢,我就直接让他去左移了,不妨我就直接去运算。然后就这样写了啊,NUMBER1。啊,或者写七啊,就NUMBER1吧,左移两位,哎,这样。哎,就这意思呗,好,那左移两位,然后我们再整一个左移三位。哎,南一左一三位,哎,就这个道理啊。或者这个我们在一点体会,再来个左移一位。哎,保存。嗯,这个是编译了。
04:04
好,回车看一下。这个七的话呢,左移一位啊,结果呢是14,左移两位呢,结果是28啊,在左移三位呢是56。你看着的话呢,好像。每次都乘以二了是吧。对啊,左一位在七的基础上乘二,哎,左移两位啊,在原来的基础上再乘二,相当于,呃,你要以七来说明的话呢,相当于这呢是七乘以,哎,在这写吧,七乘以二的一次幂是吧,这个呢。七乘以二的二次幂,这个是七乘以二的三次幂。哎,而这个123呢,恰好跟我们这里边儿左移的这个位数呢,是有关系的。哎,其实这个规律的话呢,也就出来了。哎,通过刚才这样一个举例呢,我们想说明的这个规律。哎,这个呢,写一下啊。说呢,首先啊,我们这些符号针对的都是数值类型。
05:03
哎,针对啊数值。啊,类型的这个变量或常量。来进行运算。啊,那么运算的这个结果啊,也是这个数值。哎,这是第一个点啊,然后第二点,刚才我们看到这个符号的一个使用啊,这个符号呢,我们发现呢,说每向左移动一位。哎,那么结果呢,就在啊原有的基础之上。是不是乘以二啊。最后就乘以二了。诶,那么下一个呢,我们要解释一下,诶这为什么呀。为什么会有这样的一个规律性呢?来,我们看看这个七。这这个计算器了。嗯,咱们来一个这儿是吧,哎,七啊,这个七的话呢,在底层二进制呢,它是长这个样子的。哎,它长这个样子哈,行,那为了咱们,嗯,行我我就在这说一下吧,因为咱们课件里边也有这个其他的例子哈,然后呢,我让他向左,我让他向左移动移位了哈,哎,我把这个稍微这样变大一点。
06:13
哎,然后。有他在。我再重新再再截一下啊。差不多行,然后呢,向左移动一位,相当于呢,就是让这个二进制呢,往左边再移一下。左边一下之后呢,111位啊,那就意味着我们这里边儿是不是就有出去了一位啊。嗯,我这就出去了一位。那出去一位的话呢。这个技术要求有点高哈。就这么着吧,哎,那这块呢,就缺了一位,缺了一位你是不是得补个零啊。哎,注意缺的时候呢,永远都是补零啊,不管这个数是正的也好,负的也好,都是补零。
07:01
好,那么为啥你这补完零之后呢,这个数就变成原来的二倍了呢。咱们昨天呢,也讲过二进制的,像这里边儿是111这三个数呢,是几?咱们是二的,从低往高来是二的零次幂加上二的一次幂加二的二次幂是吧。咱们是这样加的啊。哎,这个正好算完以后,这不就七吗?当你要是往左移动移位之后呢,原来是2.2次米的位置,是不是就变成2.3次米了。哎,那么类似的道理。这不就都变了吗?哎,那么变了这个呢,其实你可以把这二呢再提出来,是不是就相当于这就是你原来的这个式子了。所以这不就相当于在你七的基础上乘了个二吗?我要再往左移动一位,原来是2.24米的位置,不就变成02:40米了。哎,这不就是相当于哎就能理解这个事儿了,所以呢,每向左移动一位。哎,这个移动哈。一位啊,这个结果呢,就在原有的基础上呢,去乘以二了。哎,就是这样的一个道理,那么这呢是一个正数,那要是一个负数呢。
08:04
哎,CTRLC啊复数。再举一个这个二是吧,这个来一个叫负七吧。后期嗯,NUMBER2。哎,这时候就行。这个呢是二啊。保存。哎,编译运行好大家看。是不是一样的道理?哎,所以说这块呢,每向左移动一位,结果呢就在原有的基础上乘以二,这个呢,我们说哎,对于正数负数都适用。哎,都适用。好,那么这个呢,我们说清楚了,说清楚之后呢,我说这块啊,还不够精准。呃,假设呢,呃,你现在呢,只有七块钱。哎,告诉你的就是诶,你每做一个小的操作啊,向左移动移位呢,你的财富呢,就会增加,每次呢增加二,这可是指数级的增长是吧。
09:00
你肯定特别嗨哈,然后你就会想着。多移动几位是吧,越多越好,那这时候呢,我们就要体会一下,哎,越多有没有一个限度。啊,你看现在呢,这个漆呢,底层是长这样的哈,哎,我说呀,你往左移的时候呢,移到一定情况下呢,这个事儿就可能不太靠谱了。哎,我要往左移。大家你看啊,一到什么样的场景呢。一到这个时候。实际上呢,差不多就到头了。这边呢全补零最高位注意哈,这个时候的最高位呢,实际上是这个零啊,这时候呢,还是个正数。你要再往左移动一位的话呢,这个最高位就是一了。你就立马呢,就成负资产了是吧。哎,咱们演示一下啊,你看我要移动到现在这个场景,这是移动了多少位。
10:01
哎哎,这个我就还写到这儿吧。嗯,你看一共呢,是32位吧。这呢是四位,那就是28位吧。对吧,这我写28,这个我写成28行,那你要再往左移。变成29。哎,保存一下啊测试。编译运行大家你看诶,向左移动28位的时候呢,这时候你的资产呢,是这么多挺嗨的啊,你说再来一下,再来一下立马就亏钱了。啊,你看现在好多这种。这个咱们国家的这种也是一说富豪排行榜多少多少的是吧,特别有钱,其实他们呢,也是胆战心惊的啊,一不小心的话呢,立马就是亏好多个亿是吧。那好像这辈子有的都翻不了身了,可能对你来讲的话呢,你想亏这么多还亏不了呢,是吧。啊,银行也不允许你亏这么多呀,啊行,你看这呢,就是我们说的这样一个场景,所以说的话呢,呃,实际情况就是,诶,我们前面要补一句话啊,说呢在一定范围内。
11:07
每向左移动一位呢,哎,相当于就乘以二,这个呢,如果我们用一个成语来修饰呢?这叫过犹不及。嗯,这个词应该都知道,不知道的得查一下字典了啊,哎,就是我们其实做很多事都一样啊,你不能太极端了,一旦极端了就太偏执的,一旦偏执的很多事儿呢,可能就变了。是吧?那你可能对一个女生好在一定范围内呢,她特别的暖心,那你要是她的任何一举一动你都特别关心,她就受不了了,是吧?感觉变态了是吧。行,这个呢,就是我们说的这样一个场景,那由这个场景出发呢,其实这里边儿呢,就提到了一个面试题。这个面试题呢,是特别老的。换句话说呢,就是比较经典的是吧。哎,那就是,呃,用高效的方式。计算二乘八。
12:00
啊,有同学可能听过啊。嗯,二乘八高效的方式。怎么计算?啊,那首先呢,就想到说我我我整个不高校的是吧,哎,不高校你就直接写二乘八。或者呢,你就理解成两个八相加,或者八个二相加啊,这都是这个相对来说一般的这种想法,诶,如果要是高效的话呢,就是。二呢?左一。三位。哎,这个三呢,这个八恰好是2.3次幂嘛。哎,每向左移动音位不是乘以二嘛,所以乘三个二那不就是。三左移3343这个三三次呗,是吧,或者的话呢,是八呢左移。因为二呢是二的一次幂嘛,所以一位是吧。哎,你答这个也行,答这个也行。当然有同学就较真了,说这个不是比这个好吗?这个移了一次,这个移了三下是吧。对于CPU来讲,这个呢,你就别这这这都绝对都都可以忽略掉了是吧?诶我们把这个呢,其实呢,在这个数据结构里边,我们会讲这叫复杂度哈,他们复杂度来讲实际上是一个级别的,就是你移动一下跟移动三线呢,都算是常量级别的。
13:10
就没事是吧,不像呢,比如我们八个二相加,这就已经是涉及到这个呃N次了是吧?呃,它是跟这个N的一次幂相关的了啊,这个可能有同学听不懂,后边我们讲集合的时候讲这个,呃排序运算的时候呢,我们稍微提一下这个复杂度的问题啊。好,这两个呢都可以,这个就是高效的方式。好,那这个说完之后的话呢,下一个问题又以。那那这块呢,能大体上是不是也猜出来了。哎,我们向左移的话呢,就都乘以二,那你每向右移动一位,原来呢,你像咱们说这个七哈,是二的二次幂加上二的一次幂加上二的这个零次幂了,你往右移的话呢。原来是在二次幂这个位置上,是不是就变成2.14米了?这变成2.0次幂了,后边这个这就没有了。相当于这不就是除了个二吧。哎,对的啊,所以说它的理解啊,我们包括复数呢,也是使用的在一定范围内每向右。
14:07
那移动一次呢,相当于在原有的基础上呢,就是除以二了。哎,对于正数负数来讲,哎都是适用的。啊,这呢,就我们说的这个道理啊,这个的话呢,其实呃,我就不在这块去测试了,咱们直接看我这里边写的这个练习啊,这个例子这呢是这个左移的啊,这个是用的三,哎,咱们也再看一看这个其他的一些例子啊,这个三的话呢,它的二进制呢,看是长这样子的。然后呢,我这是让他呢左移的四位,那不就出来四个,然后最低这个位置呢,我用四个零去补,补完以后呢,你看原有的这个二的一次幂的位置呢,它就提升的就比较高了。那就多了二多成了24次幂了。OK啊,然后对于负数来讲的话呢,负数负数的话呢,我们需要拿它这个补码去考虑,这是它的补码,它呢向左移的话呢,这就出来了四个一,这呢你看还是个负数。呃,然后呢,这块呢,我们也是拿零去补的。
15:00
诶拿零去补的啊,诶那负数这块你看啊,我要是往左移往左移移移移移到一定程度的时候呢,假设哈,诶我们要移到这个零变到第一位了,这样呢,这个负数是不是瞬间就变成个正数了。对啊,这也就是我们所说的,它在一定范围内啊,是负的,你要在移的时候呢,这个超出这个范围呢,它可能就变了,跟这个正的呢,你移到一定程度变成负的也是一样的道理,好,那么右移啊,那右移的话呢,相当于就是除以二的一个意思了,比如说我这是69 69长这样。啊,然后呢,它是叫右移四位,那就是整个往右移,那除去这四个。然后呢,高位这块注意。正数来讲,高位不零。负数呢?哎,负的嘛,所以高位呢,补一。所以呢,负的你除完以后呢,就是呃,向右移弯以后呢,正常来讲还是负的。啊,还是负的啊,所以呢,你看这个正数呢,我们又移完之后呢,缺几个就补几个,哎,那就相当于是每移动一次,就相当于除以个二。
16:00
哎,这个呢,哎也是往右移,每移动一次呢,相当于也是除以二。啊,这是这个右移的这个场景。行,这就说完了啊,我就不用刻意测试了,这个本身咱们说也不太重要,大家知道这个逻辑就行啊,然后下边这个呢,叫无符号右移。哎,无符号右移的特点就是不管你这个数是正的还是负的,无符号嘛,我在向右移的时候呢,高位都补零。啊,正数高位补零,负数呢,高位也补零,那就意味着我们这个负数呢,只要你移动一位。它就瞬间变成一个正数了,对吧。哎,是这样子的,那那如果说我们是想体现这个数是除以二的,你是用这个符号还是用这个符号呢。就是我,我有一个数,我想让这个数除以二。是不是得用这个。对,你似乎说说正数的话呢,是用它跟用这个一样,但是你要是负数的话呢,是不是只能用这个,这个就不行。
17:03
因为这个要一往右移,是不是就变成正数了。对不行啊,哎,正常来讲呢,就是你要想乘以二呢就用它,你要想除以二呢,你就用它。哎,这个注意啊,那这个符号的话呢,什么时候用啊。啊算绝对值,呃,算绝对值也也也呃先你要正数的话呢,还是它负数的话呢,这个一般以后呢,求个绝对值啊也是是吧,当然呢,这个绝对值一般我们开发中也没啥这样的场景啊。在开发中我们什么时候会用它呢?你看啊,我们后面呢,再计算呃一个数据,这个数据呢,我就泛泛一说啊,我要把它放到一个数组中的某一个位置的时候,哎,它到底要在哪呢?我们会给它做个运算啊,就是给它揉一揉是吧,咱这个图画啊,哎做个运算,运算完以后的话呢,把它放到某个位置,这个数候呢,假设是个int类型的哈。那就意味着是不是有32位。
18:00
好,那么我呢,就让这个int型的这个值,假设呢,它叫N哈,呃N1吧,这个N1呢,我让它呢,无符号右移16位。那就意味着它移动完以后呢,是不是就长这个样子了。诶这个第一位的这16位呢,就不要了,诶那么我要是让他五号右翼16位以后呢,这块呢全补零,说白了就是这块你是什么呀,我也不关心,诶这个时候呢,得到的这一块数据跟这个数据呢,我让他们做一个接下来的,比如说是这个与运算呀,呃抑货呀,哎还是这个货呀,诶做一个运算,说白了啊,这个符号呢,我向右移动16位之后,我就相当于让你这个N1低位的16位和你高位的16位呢做一个运算。啊,就让大家,呃,不知道大家这个在家做不做饭哈。那我是这个河北的啊,这个啊,我说叫北方也不准确,还有东北的是吧,呃,华北这块呢,是主要吃面食的啊,像这个小时候呢,大家基本上都蒸馒头。我没蒸过啊,看我妈蒸馒头的时候,你发现他这个和面嘛,和面的时候经常或者大家平时在外边买包子也一样啊,他会把这个面呢,整个的翻过来是吧,揉一揉啊,再整个的对折一下,揉一揉是吧,这个对折的这个行为,其实就相当于用这个符号这个意思。
19:14
让这个数据呢,混淆一下。啊对啊,以以后再说啊,现在一说有点说多了,这个呢就是它的一个场景啊,这几个事儿呢,哎,我们就说完了啊,这个说完以后呢,接下来我们看一下还剩几个符号,就是这几个。哎,这几个啊,这几个的话呢,咱们直接看一看这个例子就懂了,其实很简单。比如说哎,我这儿呢是九跟七,哎这个或者是负九跟七啊这呢是用这个与下边这个或啊下边这个抑或或者是这个取反,哎什么意思,咱们说一组大家能明白。这个与的话呢,咱们在逻辑运算符里边叫且,哎,那么我把九呢列出来,把七列出来,大家呢,把他们各自里边这个一啊,你看成是处。你把零呢看成是false。
20:01
那么这个呢,你就看成是逻辑的且了。那么一和一在一起就是一。零和一在一起就是零。啊,零和零在一起也是零,这样呢,就得到这个结果了。啊,对啊,复数同样道理啊,只不过要注意就是复数呢,是拿补码来说的。哎,你该怎么着还怎么着。就行啊,那么类似的这个货呢。哎,就是还是啊,一看成是负零看成是false,只要上下当中有一出现了。就是处。那都是零的结果是零。哎,就是这个道理。行,哎,那么这个呢,抑或呢,也是一样,上下呢,如果都是一,或者都是零,结果都是零。啊,一个是零,一个是一的,这种结果是一。那这就是相当于呃,叫易货的这个操作好,那么还有一个叫取反。取反的话呢,就是包括符号位在内啊,你比如说这块是九啊,长这样,包括符号位在内,零变一,一变零。
21:03
那就意味着像正数要是取反就变成负数了,负数要取反呢?就变成正数了。哎,你看我多问一句啊,这个九取法呢,叫负十是吧。那要是负十取反呢?是酒不?看你有没有理解这个本质啊。哎,输出一下啊。哎,这个,诶这个我就直接写了啊,这个九取个反。徐可反在这儿啊,就是咱们这个键盘的一左边那个。先。编译啊,运行啊,没保存啊。编译运行,哎,这个就复持了,好接下来把它复制一份,这个呢叫扶持是吧,诶赋值取法呢。来说是不是正11啊。
22:01
哎,这不就是九嘛,是吧。哎,这个你想本质上来讲不就是,呃,你这个负十的话呢,还是把它的所有位,包括符号位再去反,那不就回去了。是吧,诶OK啊,所以呢,他们就是互为是吧,取反的这种情况了啊。行,这就完事了啊哎,这些符号的话呢,咱们开发中呢,其实用的咱们自己用的话呢,用的不多,呃,在源码当中呢,其实就用这个左移和右移的这个场景会多一点,再结合着呢,刚才提到的像这种符号去使用,后边呢,我们见到场景的时候呢,咱再说。哎,这就可以了,行,哎,那么关于位运算符这块呢,哎,下边我有两个举例哈,哎,这是一个举例,就是又体会一下他们之间关系,上面其实已经讲过了,然后这边有这样一个关系式,这个关系式的话呢,我们可以通过这样的一道题目呢去体会一下。咱们把这个题目呢,可以稍微的写一下。嗯,这个呢,我再写一个这个化程序啊,关于呃,微算数的一个练习。这个练习当中啊,就用到我们刚才提到这样一个公式啊。
23:05
好,大家看一下这道题目。这个需求啊,在我们后续开发当中非常的常见。说呢,如何交换两个变量的值?这两个变量呢,可能是int类型,String类型等等啊,可能是多种类型的。那咱们以这个in的类型为例来说吧。啊,也就是说现在呢,我有一个值呢,M是十,有个N呢,这个十呢是20,我希望呢,交换这两个变量的值。现在呢,我去打印一下这个M的和N的这个值。OK啊,那显然呢,一个是十,一个是20,然后接下来啊,你在这块呢去交换。哎,两个变量的这个值交换完以后呢,你再去打印,希望呢,M是20 N呢是十,问怎么做。
24:03
找一个中间值是吧。对哎,我先说这样做,你看行不行哈,我想可能会有同学去这样想,说你让交换,那不就是M改成20 N改成十嘛。这,这不挺好吗?这个你怎么给他去。反驳一下呢?有同学说呢,诶,我还没这样想过是吧。嗯。这个怎么给他说呀。嗯。对这个操作啊,都是基于你已经看到它值是多少了是吧,那你说万一我这块我是30我是40呢,你说那我这也改啊。嗯,那你不能这样啊是吧?呃,以后的话呢,咱们会讲方法啊,我会把这个操作呢,写成是一个方法,我希望什么呢?就是我不管你这个M和N的值是多少,你把这个方法一调,一出来的结果就是交换的。
25:02
也就是说呢,你不管MN是几哈,我这个方法都是有通用性的是吧。那你现在呢,你完全就是针对你这个极其个性化的两个值写这个操作,这个操作呢,没有任何的可复用性的场景。啊,上面一写,下边就紧跟着得改一改,那你要是成员的话,能累死他是吧,你就相当于大家,比如说中午了,你要点餐了,你打开这个美团外卖是吧,你往上划你都划不完是吧。如果说每一个数据都是程序员自己去写的,那我估计上亿的程序员也搞搞不定这个事儿,每天信息大爆炸,所有的信息程序员一个一个的往上面去填的是吧?那不就累死他了吗?啊,它得通过循环呀,等等这样一些线上结构,我就一调自动的就给你把把这个数据就填上了是吧。OK啊,包括呢,我们说呢,每个人的个性化的这种推荐,他一定会有相关的算法,把这个设计好以后呢,你就每个人都这样跑就行了。啊,可以做一些个性化的情推荐的情况,你不能每个人说他一看你是这样特征,我就一个一个给你去摘你自己喜欢的,那能不现实,累死了啊。
26:01
那所以说这个写法呢,它不具备这种通用性哈,是不可以的,那么刚才呢,大家提了一种方式啊,说我找一个中间量,其实这个呢,是非趁好的一种思想,也是我们后边啊,就是用的这种想法,好比是呢,我这有两个杯子啊,这个杯子里边呢,放的是这个。什么神仙水啊?诶,可乐是吧,这个呢,放的是这个橙汁。啊,现在呢,你想把这两个杯子的这个饮料呢,互换一下,怎么办呢。你不至于说呢,把这个瞬间的倒到天空当中,然后这个倒过来,然后这个接住吧,是吧。这个应该没有这么强的功夫哈,你是不是得找个空杯子是吧,把这个倒进去。啊,然后呢,这第一步啊,把可乐呢倒到这儿。第二步呢?哎,橙汁倒到这儿是吧,然后第三步呢过来,哎,这是第二步,这个你也不能混了啊,哎,这这三步也有严格顺序,你第一步到到这儿,你不能下一步呢,就。整这个了,这不又混了嘛,是吧,哎,所以呢,如果这个是M的话,这个是N的话呢,你看这有个顺序,这个呢,你可以起个叫临时变量就叫T是吧。
27:08
所以这呢,你看它也是有这个顺序要求的。好,来把这个事儿呢,我们刻画一下,首先呢,你得定一个临时的变量,哎,这个临时变量呢,我们通常称为叫ta了啊。嗯,第一步呢,就是把M的这个值呢,给了这个ta,所以呢,我就这样写。没问题是吧,好,那么第二步呢,是这个啊。把这个N的值呢给了M,把N的值给了M。这样写。啊,从右往左第三步呢,把这个time的值呢给了n time值呢给了N。是不是这样写了?哎,这几步呢,你注意这个顺序啊,哎,它得有严格的,你不能把下边这俩交换一下就麻烦了。行,写完以后做测试。编译运行,那这个结果呢出来了,那说明这样是可以的。哎,那么这种方式呢,我们称为它叫方式一,就是诶使用或者叫哎声明一个。
28:04
啊,中间变量,哎,或者这个叫一个临时变量。哎,这个呢,是非趁的一种方式啊,那我们推荐大家这样去做。诶,保存一下啊,那么以后大家在写的时候,你不用再去画这个图了,有一个小的技巧啊,我告诉大家技巧,你可以这样来看。哎,这么着啊呃,以后你在写的时候呢,你上面呢,就先找其中一个变量,把它付给这个临时变量,然后第二行的话呢,就是你上一行的后边这个元素。哎,这个也是一样啊,哎,第二个,呃,后边的元素呢,就是你下边一行的第一个元素,哎,这样一下这就错不了。那就可以了啊,行,这个对齐再拉回来。诶,这呢,就我们说的第一种方式好,那么咱们这块呢,既然把它放在未运算付这块呢,就会考虑除了这种方式之外呢,还有没有其他的方式,哎,我就先把它注释掉了,下边我们再看一下这个叫方式二啊。方式二的话呢,大家还有没有别的什么想法。
29:02
交换。啊,这个你看我我想一个稍微的有点这个这个呃,变态的一个场景是吧。假设现在呢?这有两个小岛。啊,这两个小岛呢,特别小啊,你呢,站在这儿。呃,另外一个人呢,站在这儿,这个呢,只有叫呃立锥之地是吧?啊,只够你站着一个人啊,现在呢,我要求啊这个两个人呢,交换一下他俩这个位置。啊,你说这个跳过来不行,只能只能站一个人啊。这咋咋交换呀。同时跳啊,那不撞到一块儿了吗?啊,一个跳的低一点,一个跳的高一点是吧。这个对,是个技术活啊,可以是吧,有没有比这个难度稍微低一点的。哎,对对,就是这个人呢,是不是跳到这个人的脖子上是吧。这个稍微难度也大一点是吧,然后呢,这个人在整个跳过来,这个人再下来。
30:02
可以是吧。诶,那么这个想法你看放到我们这儿的话呢,呃,类似于是怎么着。对,这呢是一个数,这一个数把它俩加一起是吧。好,你看一下啊,我让M呢,加上这个N,这就是30了。我没有一个临时的变量,就跟说这两个小岛,你说我要在一块空地,那就好办了,跟方式一一样了啊,现在没有第三个变量了,我把它呢,结果呢,给了其中的一个值。注意,这时候M已经变成30了。我让这个30呢减去,你别减M了啊,别减没了,是不是减N了。30减去20。结果是十把十给了。对,这不N就变成十了吗。然后呢,我在M还是30哈,我再让这个30减去。N。N不就是原来的M的值吗?啊减去十,呃,30减去十是不是20啊,把20给了M。
31:04
扛不住了,这个这个烧脑了是吧,我把这个给你稍微列一下啊。哎,十加上20是吧。嗯,然后这个是。30减去一个20。30减去一个十,得到一个20是吧?哎,就这样的场景,稍微体会一下就行,哎就这样写啊好,那这呢结果保存运行。编译,哎走哎没问题是吧,哎这样也行好,那么问这种方式跟这种方式比,哎你说这种方式的优缺点是什么?先说优点吧。哎,对,不需要定义一个临时变量。哎,节省空间是吧,当然这个节省空间的事儿基本上可以忽略哈,啊啊,这也算是个优点吧,缺点呢。有点难是吧。对,还有吗?
32:01
哎,我说的它的适用性差。什么叫适应性呢?你想啊,如果现在我是两个字符串。大家现在在上海。哎,如果呢,你想去北京。这是两个字串是吧,哎,现在呢,你买了从上海到北京的车票了啊,刚到北京,结果北京说说不行,现在政策非常严,你回去吧。这是有可能的是吧,诶这块你得买一个返程票,返程票呢,诶原来呢,你看在12306上啊,这个原来我买票的时候就发现,诶我买的这个记录呢,它有啊,我一打开的时候呢,诶它这有个按钮,我一点诶就交换了。哎,那么1.0按钮呢,其实里边就有一行有几行代码就操作了是吧,他就把这两个字符串呢给交换了,哎,那么如果是个字符串的话呢,我们用方式一是不是完全没问题。哎,那么你要用方式二呢。都没有减法是吧。哎,所以就不行,所以说它的适用性差,它只适用这种数值类型的。再换句话说,还有一个问题就是你这是个数,这是个数,这俩要万一加起来超出了int的范围了。
33:05
也挺麻烦的是吧,就跟说呢,你这个人呢,跳到这个人的这个头上,结果呢,房顶没那么高是吧。哎,就是脑洞一下呗,是吧,所以这个时候我们说适用性差啊,就是什么意思呢,就是不适用于。呃,非数值类型。啊,这是其中一点啊,另外一个呢,就提到了,他这个可能超出。啊,Int的范围啊,这个呢,也是它的一个缺点,总之呢,这个大家了解一下就行啊,把它注释了。这里边儿呢,仍然没有出现我们的位运算符方式三。这个呢,就有位运算符的这个身影了。啊,那这个呢,方式大家可能不太容易想啊,就要用到这样的一个知识点,这个知识点是什么呢?就是M和N,我取一个抑或,抑或完以后的话呢,我再抑或上其中的一个值。就得到另外那个值了。啊,你比如说这个啊,M呢是13 N呢是五,抑或完以后呢,这个结果,这个结果呢是八,这个你不用去刻意记啊,那么这个结果呢,再跟这个N呢去做一个,抑或它就会又得到M。
34:11
啊行,那有这样一个情况呢,你看啊,我说呢,让M呢去E或上。啊,亦或上一个N,让这个结果呢?我给了M。啊,接着慢一点啊,M呢,我再去抑或上这个N。这个结果呢,E或上N其实该等于M了,是吧。但是我把它给N了。啊这样,然后M呢,我再议会上这个N。M呢,还是M1或N的这个结果,它E获得M呢,是原来的N,呃或得N呢是原来的M。得到的是给了M是吧。这个这个有点变态是吧。对,其实跟上面这个有点差不多啊。对啊,就是主要呢,看这一步哈,这里边儿这个M呢,是原来的这个。上一步的这个吗。
35:00
这个呢,如果你要是异或上这个N的时候呢,它得到的结果呢是M。哎,把这个M呢,又给了N了吗。啊,然后这个N呢,其实就原来的M嘛。就这个思路。行,那这种方式的话呢,运行一下看结果。编译运行你看也是可以的啊。好,那么看一下这种优点。跟这个一样是吧,缺点。是真难呀,是吧。啊,比上边这个还比上边这还难啊,然后接着呢。是不是也有这个问题?哎,也是适用性差啊呃,那但是后边这个事儿呢。不存在了。哎,对,就好比上面这个稍微的好那么一点点啊行,那大家呢,就简单体会一下就行啊,就是这儿呢,算是一个小例子了,那结论是什么呢?结论就是这两种方式呢,咱们平时都不要用啊,你就用这种就行。啊,这个呢,适用性也好,临时变量如果多用个空间,对咱们也说过啊,你浪费的空间何止这一点点是吧。
36:02
OK啊行,这呢,就是我们关于这个微运算符的这个课后的这个题目了。啊,这是第一道题,咱们已经说过了啊,就这样啊,行,大家休息一会儿。
我来说两句