00:01
位运算符,位运算符在前面咱们已经讲过了,对吧,这再简单回顾一下它的预算符呢,有这么几种,六种安位于。安慰或安慰抑或安慰取反。左移。又以。对,那么安慰语呢,它这个规则很简单,就是什么呀。就是什么安慰语,就是说你看零与零和零相与的话,变零一和零。一和零,呃,零和一也变零一,呃,零和一,这是一和011那说明什么呀?就说与的意思,就是说什么呢?注意听这句话安慰与的意思就是说只有两位,两个都为一的时候才为一,其他都为零。看到没有,那么再看或安慰或呢,简单的看这里面零和零,这个000或的话呢,还是010是一。而零,一是一,一零也是一,一也是一,说明什么呀?说明这个规则说只要有一位是一,那么就是一,抑或是什么呢?简单的讲,大家看这里零零亦或得零。
01:13
零,一亦或为一,一零亦或为一,一一亦或为零,说明什么?说明?说明就是说呃,两位不相同,就是一个是一,一个是零,它就会一。如果一个零,一个一也是一,如果两个相同,比如这是零,零,这是一,那么这个为零,这个也是零,明白了吧?就抑或的意思,就是说只有两位不相同才等于一,否则就是零。那么取反而很好理解,就是一变零,零变一,那么这个。二进制的左移呢?它其实是干什么?它的规则将一个运算对象的各二进制全部左移若干位,而且呢,二进制的二左边的二进制位丢掉。
02:02
右边补零就右边补零,待会我们想好,那么这个是二进制的右移,右移是将一个数的各二进制全部右移若干位,正数左边补零,负数。补一这其实就是我们说的算数右移,因为它能它在移动过后呢,它能保证这个数的符号不变,而右边丢掉。好,这个规则说完了,过后呢,我们必须要举几个例子,结合刚才讲的二进制的源码、反码、补码,其实你才能真正的理解。那么我们现在呢,看这个题哈。刚才刚才老师对这个位运算符的规则呢,其实说了这里再简单再总结一下,安位与与与指的是两位全为一,结果为一对这个时候,否则就为零。只有两位全一的时候,结果才一,其他都是零,安位或呢,两位有一个为一,结果为一,否则为零,就只要有一个一就为一七,否则的话就是零。
03:01
那二为一或就是两位有一个为零,一个为一,结果为一,否则为一是不是一样,道理取反,就是零变一,一变零,那现在我们讲这两个题啊,我把前面这两个给大家讲了,然后大家就知道是什么结果了,好,我给大家推导一下。如果按照这个取反。或者这样子讲吧,咱们来一个大家呃,随便讲,我讲一个这个哈。就讲这两个吧,其他一位是类似的,或者讲一个。呃,讲一个这个吧。讲一个取反的,讲一个这个。我给大家讲一个这个曲,这个再给大家讲一个。或啊或者时候呢,我们故意整一个负数,为什么要整一个负数呢?因为呃,只有如果都是正数的话,有时候你看不出来它的本质,就是一定要讲一个负数才能把它讲清楚,讲你才能真正理解,我就我就讲这两个好吧,嗯,那首先我们来看看,如果对二取反,它这个结果是什么呢?我画一个图来描述,注意听这句话啊。
04:06
负二,我们现在呢,比如说要求对二取反。这个等于多少,首先第一步。我们知道一个数呢,都是按原码来进行运算的,大家还记不记得刚才说了这么一句话。我们计算机运行的时候呢,都是以啊,都是以补码的方式来进行运算的,所以说我首先要得到二的补码。二的补码,那么同学们二的二的补码实际上就是原码,因为它是一个正数,所以说二是正数,正数因此补码。补码和原码相同。是不是,所以说我们直接就推出来了,那现在我们怎么推呢?我们假定我们以一个字节来推,因为这个二本身它是个整数,它是四个字节,如果四个字节的话呢,我我要画很长一段对不对,如果我严格画应该这样画,那二的不满应该是首先符号位画出来。
05:07
符号卫视您12345678 12345678 12345678 12345678,好,这个地方变音。也就是说这个同学们,就是我们二的什么码呢?二的补码。那当然也是它的源码了,反码也是,因为正数的补码和反反码一样,所以这就这个,下面这个是二的什么呢?二的补码。很好理解对不对,现在呢,我们就对他取反,对他取反。那么同学们,取反这个规则是不是刚才已经刚刚说过了,取反的规则是什么呀?就是一变零,零变一,那我们看一下,一旦取反会变成什么呢?111124个1212345678。
06:00
12345678 12345678,再来123456。七八为什么呢?因为这个一变成零,这个里面一取反,就它,那现在大家看一个问题来了,同学们,这个这个到底是多少呢。各位,我们先问大家,当他运算完了过后,取反完了后,这个这个是什么码。这个其实还是一个补码,对不对,所以说如果你想看这个数的真正是多少,你要把这个补码要把什么呢?如果啊。我们我们要看这个结果,需要把你现在得到的这个补码转成源码。就是将上面的。上面注意听哦,上面的这个补码或转成源码。才能看他真正的结果,因为它是补码嘛,它不是源码,所以说你要转成这个,又要反向转回来。
07:04
那只是这个工作呢,如果人不去做,计算机是帮我们做的,现在咱们不是在想,咱们不是在学计算机怎么操作的吗?那大家想一想,这个怎么换,首先你要判断第一步哈,你要判断它是什么嘛,它是一个什么数。是一个正数呢还是一个负数,我问大家。同学们看现在。现在我问大家,这个数你们觉得是一个正数还是负数?显然它是一个负数。为什么它是个负数啊,因为它的符号位是一,这就比较麻烦了。其实它这个很麻烦,因为你要看它的结果,你要把它转成转成这个源码,而这个呢,刚好是负数,而负数的这个。源码和补码不一样。因此我们需要把这个转成。转成这个。就是要把上面这个老师高亮这个转成源码的话呢,首先先先把这个转成他的反码。
08:06
来把它转成反码,这个对应的砝码是什么呢?是对应的砝码先算出来。那么大家还记不记得反码和补码的关系是什么?反码和补码的关系是什么?我们是不是前面学过,我们学过一个负数的补码。是他的砝码加一。那它的砝码是不是就等于它的,如果求它的砝码是不是它的补码减一啊?因此实际上是什么呢?对应的砝码是。是他的补码。补码减掉一个一,那补码减一个一,这个很简单了,就在这个基础上减一嘛,减一那得到结果,当然一下就得到了。应该是零。但是现在是反码,你还要把它转成原码才行,上面将将上面的反码再转成原码。
09:02
那么同学们还记不记得,还记不记得反码和补码,呃,反码和原码的关系看一下。我们刚才讲过,负数的反码是等于它的原码,符号位不变,其他取反。那显显然你如果要从反码去推源码的话,是不是也是符号位不变,其他区反。注意听我刚才说的这句话,是不是也是符号位不变,取他取反就得到这个源码了,是的,那我们就拿到符号位不变,那就一不变,其他取反,1234567 123456718,还有个八啊,12345678。12345。六。七八。大家看能告诉老师现在是多少吗?看出来没有?这个是符号位,表示它是一个负数。
10:03
那么这边是它的第一位幺幺是是不是刚才讲过,是不是三呢,得到结果了。是不是有点麻烦,但是这才是真正的学懂了微运算,不然的话你其实是很难理解,它底层其实是这样子的,它的底层是先把它用这个补码进行操作,然后再把这个补码换成原码,才是我们最最后结果,那也就是说我们这个对二取反,其实最后结果应该是负三。是不是不删呢,我们来验证一下,打开我们的这一个。对呃,打开我们这个VS2010,我们来看一下是不是这样子的,打开它验一下。打开我们的这一个,呃项目。然然这边是我们的第几个章节呢?现在我们是,呃,现在又是一个章节了是吧,我看看是不是现在是第六个章节。第六个章节,好,我还是新建。一个这个文件夹哈,CHAPTER06。
11:04
那么这边有个小案例。对,这个小案例我直接写,写成案例就行了,好吧,直接写一个名字。叫exercise ex ex ex c,好,那现在呢,我们把刚才。这一个对二取反的结果输出来,大家看一下。来,走一个吧。诶,这边他刚才告诉我什么错误了。没有错误是吧,走include。Include stdl。让,让我写一个主函数。好,同学们看,我用一个数来接收,比如说A,我对二取反。我输出这个A到底是多少。A等于等到D,然后呢A。那么为了好看呢?给它掐一下。好,这咱们就写完了,那现在我们运行。
12:01
这个二的取反的结果应该是多少呢?走起来。跑起来哈,跑起来跑起来,这个结果呢,如果不出什么意外,就应该是,诶,我看这哪里有错。哦,这个test里面应该是有。诶,为什么他test有错呢?这边是不是有两个相同的文件名啊,但是我试试一下啊。好,那这样子,我们这个地方应该是有一个这样相同,我再我把这个名字改一下。改成改成零二吧。好的未运算,那么叫做bit。Bit练习。好,改一下再来运行,看看是不是就没错了。诶,为什么老报这个错呢?他说没有这样的一个目录。哦,怎么这边怎么也变了呀。
13:05
这有一个哈。我把这个关闭一下。那那干脆这样子,咱们不啰嗦了啊,咱们把这个把这个代码重新,因为刚才给他取了个相同的名字,导致现在遇到一点小麻烦,我先把它删掉。好,删掉,我们重新建一个,建一个呃名字。好,咱们取个名字吧,叫做叫做exer c,那么咱们取一个零几呢,前面已经有很多名称了,对不对,咱们就叫。卖啊,我的一个练习。走,再区分一下。然后这边呢,我们把这个后缀改一下。好,因为刚才那个文件名重名了。好,这样应该就不会再有事儿了吧,这个再有事就应该说不出说不过去了,走,跑去。哎,为什么他老报这个呢,他说exercise c。
14:07
那删了吧,这个。这个地方为什么这错误?工具太垃圾了。太垃圾,这个工具。好,我们再来。生成一下。先不运行。好,现在没,现在应该没有错了,在运行。好,大家可以看到的确是等于负三。的确等于负债,也就是说刚才我们整个这个分析的过程呢,是完全正确的,好,如果有了这样一个基础,同学们,我问大家一个问题,现在有了这样一个基础。同学们再去做这个是不是也也是很轻松的事情,来我们再把这个题做一遍啊,我再做一个这个,其他的大家就就应该可以推出来了,来走一个。那现在呢,我们再来推。暗卫语的一个案例,快速的走一下。加深一个印象,首先呢,二二的补码先拿到,因为二呢,它是一个正数,它的补码,它的补码就是他自己。
15:09
对,它的补码就它,所以说二的补码就它。就拿到了,一定都是按补码,负三有点麻烦,负三的补码要拿到,负三的补码呢,它是一个负数,所以它的源码和补码是不一样的,我们一步一步推,先拿负负三的源码。先把负三的源码拿到,负三的源码应该是一,因为它是负数,1234567 12345678 12345678,好,再来123456。起吧,为什么我要把这个给你们演示,一步一步推导出来,就是让让大家知道他是知道是怎么来的,不是说给大家一个答案哈,就是要知道他是怎么推导的,那负三的反码是什么呢?负三的反码是不是就是符号位不变,其他变一啊,那这边全全变一。
16:01
1234567好,这边是不是也变一。12345678好,这边是不是也也也全部变一啊。12345678好,这边是不是最前面全部变一。后面两个变零能理解不好,那现在呢,负三的补码是不是就拿到了。不,马。各位补码是不是反码基础上加一,那就在这个这个基础上加一个一,那加一是不是就最后一个变一就可以了,那现在大家看这个是补码,这个也是补码,他们进行一个安慰语来了。这个和谁呢?和这个进行一个安慰语。那么安位语规则是什么呢?同学们还记不记得安慰语的规则是什么呀?就是什么,就是刚才我们这总结这句话,安慰语是两位全为一才为一,否则为零,那就来看这个结果,全为一哈。
17:01
嗯,暗卫语现在是暗卫语的一个操作走起来,那这个就零了吗?一二就全零。是不是000000000000000000。0000。零零,他全领了。因为它它的结果就是零,那也就是说现在这个是不是补码。是不是得到一个补码了,大家看这个补码它是一个什么呀,它是一个正数。它是不是一个正数,同学们,因为符号位是零吗?因此它的结果,它的这个它的结果。它整个这个运行的结果就是什么,就是同学们看到的这个字。就是这个值。因为他。安慰于他,他就那样,那换言之,这个结果就是零,那是不是零呢?我们来看一下这个结果到底跟我们想的是否一样哈,来,朋友们,我们再来运行一把。同样我写一个in特尔B,那么二按位与按位与我们的负三。
18:09
是不是这样子的,我把这个B呢给同学们输出,如果没有什么问题,或者说我们推导式OK的话呢,这个B应该是零,就是这个B输出是零就对了,那运行一下。看看这个结果是不是零,我们运行过程我们发现这个结果的确是零。所以说按位语它是这么来的,那另外的这几个题我就不去推导了,同学们自己练习好不好,再来看按位这个移位移运算。那么前面呢,我们还学过这两个箭头,这个是向右向右位移,这个是向左位移。那么它的规则呢?刚才老师已经讲过了,如果是向右位移,是低位溢出。低位溢出符号位不变,并用符号位补溢出的高位。
19:02
那么算术左移呢,是符号位不变,低位补零,就是我们刚才讲的这个东西。看这里啊,这边写的是不是很很有道理啊,看做一是左边的二进制丢弃,但是符号位肯定是不会变化的,右边补零是不是跟我这儿说的是一样的。低位补零嘛,啊,这个代我不知道是什么意思,把它去掉就行了,符号位不变,低位补零,那现在呢,我们讲这前面两个啊,我就举两个例子,一个一。向右移,其实这个猜也猜到是什么结果。因为在想你是一个一。你你像这个,你你向这个右边移动一个,不相当于除以二吗?这个相当于一除以一个二,再除以一个二。那一除以二其实这已经是零了,零再除以二还是零,是不是一下就推出来了。也就是说,如果这个E向右移动两位,它就是零。
20:03
那么我给他打打出来看一下。In的C1。二。好,我们看看这个C是不是零,C等于。办不到地,我给打出来看一下。它是不是零呢?如果不出什么意外,它就是零,因为它是个正数比较好,正数特别好,特别好做,是不是就是零。那现在呢,如果我把这个改成十,你们觉得是多少,如果改成十的话,是不是相当于十,因为它想右边移动一位,就相当于除了一个二。除了一个二,再移动一位,又除以一个二,那这个结果就显然很明白了,十除以二等于五,五再除以二。应该是2.5,但是保留两一个整数,所以它就等于二,明白吧,好,这个呢,就在运行,这个应该等于二,C应该等于二,看看老师的推导是不对的。四等于二。好,我们现在呢,再来看一个比较麻烦的负数,负数有点麻烦,你不能这样推导啊,苏老师,那负数相当于负一除以二再除以二,那不也等于零吗?不对,因为这个负数。
21:10
这个复数它有一个麻烦事就在哪里呢?就是负数的补码。付出的这个补码呀,跟源码不一样。所以说你你如果认为负一,你认为是负一除以一个二,再除以个二,那这个就不对了,如果是负一除以二,那不是零吗?再除以二还是零,但实际上并不是零。大家看我给下面演示一下,你们就明白了,再来一个int d等于比如说我们来一个负一。向右移动两位,向右移动两位,可能同学们会认为啊,D等于等号D,可能同学们会认为它是什么呢?按我们刚才那个推导的,好像是负一除以二再除以二等于一个零,其实这样这样推导是错的啊。实际上这个负一向右移动两位根本不是零,是多少呢,大家看。
22:06
看反正不是零,反正不是零。看到这个结果应该是一个负一,诶这个有点不好理解了,原因是为什么呢?原因是因为负一啊,它的原码和补码并不一样,如果你按照这个原先那样推导,那就错了,那我给大家来看一下,我们再把这个呢也给同学们写到这里,看老师推导过程。首先我们把负一的补码拿到,那么负一的补码拿到呢?你先把负一的源码拿到,负一的源码是不是很好拿,11234567。七是不是啊?对的,再来12345678112345678,为什么要写四个这样的符号呢?因为我们一个印的是四位,所以说四位的四位的话,四个字节的啊,四个字节,那么它的位就应该是四乘以八等于32了,12345678走那。
23:06
其实这是一个字节。这是另外一个字节,这又是个字节,这又是个字节,四个字节,因为一个特是四个字节嘛,对不对,好紧接着呢,我们看负一的补码啊,那个反码,反码是不是也很好推啊,就是符号位不变,其他全部变一,那这变成112,呃全全一改一下就行了。权一。对不对。以以最后这个要不要变成零。因为取反嘛,好,最后呢,我们把它的反码啊,补码补码拿到补码拿到补码是不是在这个基础上加一啊,如果是加一的话,其实就是就变成全一了。是不是同学们变成全一了,变全一然后呢,向右注意同学们看向右移动两位,那向右移动两位,大家想根据刚才的讲解。
24:02
如果是向右移是正数,左边补零负数就是,呃,我们是不是向右移动,同学们是不是向右移动。如果向右移动的话呢,我们这个规则是这样这样走的,将一个数的各二进制全部右移的时候,是正数左边补零。负数。呃,左边补左边补一右边丢气,那说白了,你这个。说的再直接一点哈,说的再直接一点,你你这个负一这个往这边右右移。右移,右移两位。又有两位同学们想,实际上是不是还是这个东西啊,因为他高位用一赖不说,他整完了过后又变成这个东西了。是不是还是这个东西,还是这个东西,但是这个是不是一个补码呀,同学们是不是这是一个补码。
25:02
这个补码,那这个补码你你要看这个结果,你要把这个补码转成什么呢?将将上面这个补码,将上面。上面这个补码要转成一个什么呢?源码才看到这个结果,诶注意看下这个源码是不是刚好给它对应的,如果你想反推一下也是一样的,那么我们先推他的这个反码。反码这个的砝码是怎么?呃,先推它的先推的砝码对先推反码,反码是不是在这个基础上减一啊。那这个减一不就是零了吗?再推它的源码,再推它的源码,源码是怎么来的?同学们,源码是不是符号位不变,取它全部变零了,取反,符号位不变,取它取反,000000000000好000000好0000001。是不是,那这个再看这个源码是不是这是符号位,这个是一,所以说就是等于负一。
26:03
这个刚才这个答案是吻合的。好了同学们,那现在我们这个题也讲完了,说这个结果呢是负一。负一,那最后这个向右移我就不讲了,那这个没有意义了,因为整个逻辑是一样的,我就不用反复的讲了吧,同学们给大家一个作业,给同学们一个作业,什么作业呢?同学们把前面老师给大家讲的布置的这几个题。还有这几个题,全部按照我们刚才讲的这个流程自己做一遍。同学们一定要去做哈,如果你不去做,那么这个效果是很难达到的,因为你不做的话,你其实如果只是听老师讲了一遍,你没有没有这个比较深刻的认识,所以说我要求同学们呢,把这一章听完了以后,你把刚才的这个作业。比如说13。而按位与七,五和四按位或还有负三和和三抑或这个结果是什么,你把这个结果呢,通过你的推导,然后再用我们的计算机验证一下。
27:13
这样呢,你的这个理解就会更加的深刻,以后对于我们做题也好,对于我们将来从事编程也是非常有帮助的。好同学们,那关于未运算的这些未运算的内容,我们就给大家讲解到这里。
我来说两句