计算机应该注意的一些点

在计算查找不成功的平均长度时,只要是很指针比较,那么就不算做是一次比较,如果是和空的关键字比较,那么就算做是一次比较。

散列表查找的时候,成功的长度时针对于关键字来说的,不成功的长度时针对于表的长度来说的。同时查找不成功的次数时候假设一个数字经过运算后找到了0号,或者是1号,但是这个关键字不属于任何表中的关键字,所以只能碰到空的地方就认为查找失败了(注意,这里经过计算算出的范围只能是0到mod后面的数字-1)。如果采用开放地址法中的线性探查法和平方探查法,和空关键字比较失败要➕1,但是链地址法由于构建散列表的形式不同,那么碰到空指针查找失败不➕1。

即装填因子是关键字个数和表长有关,而mod后面的数字取小于表长的最大质数,查找成功的个数就是关键字的个数,查找失败的个数为这个最大质数的个数,切记!同时线性探查到尾部还未找到会转向到头部,切记!

模2加减都是异或,模2乘法比较特殊,单位数相乘的时候运算法则是与,但是多位数相乘转化为多位数想加,这个时候运算法则就变成异或了,然后模2除法是在十进制基本除法法则之下,运算法则是异或。

6ba31513759348f9a2947449c31ce6b3.jpg

60edd97fbdde4cbb8d910bb8f9c69ef0.jpg 

四个符号位 CF ZF OF SF 分别表示无符进位,是否为0,有符号是否溢出,有符号是否为负。所以第一个无符号,中间是中立,另外两个都是有符号的。

在求SF和OF的方式都是在补码情况下的,以下的情况包括OF的两种情况,而遇到CF就把所有数的当做无符号数就好了。

对阶和舍入都是向右移动。

异或的本质是多个数字中有奇数个1就是1,否则为0。

算数移位的对象是有符号数,移位的过程中符号位保持不变。而逻辑移位将操作数都视作是无符号数。

模的本质:一位十进制的模为10,四位十进制的模为10^4,二进制也是一样的道理,一位二进制的模是2,四位二进制就是2^4。模运算其实就是将减法变成加法,即A-B=A+(模-B) 但由于数值位的限制,更高一位的数值就被约掉了,这个过程叫取模,即只取模限制的那几位数字。如果一个小一点无符号数减去大一点的无符号数,这样就会产生符号,故需要转换成有符号的补码运算。补码的减法也适用于模运算,将-a变成+[-a]就可以了,具体的是:从右向左,碰到第一个1后,保留这个4不动,后面的按位取反,包括符号位。

双符号位的目的是可以取溢出的中间结果,双符号为第一个才是真正的符号,第二个用于存放溢出的结果。所以后续乘法除法的时候需要使用双符号来,因为乘除法不像加减法那样一次就可以出结果,所以需要使用双符号位甚至是三符号位来保存乘法中间运算的时候出现一次溢出但是却不能舍弃的情况,这才是多符号位引入的原因。当双符号位为01表示正溢出,10表示负溢出,即0为正数的时候,有一个1吐出来了,1为负数的时候0突出来了。双符号位一般用于补码。

时刻记住ieee标准里面的移码的偏置值是2^n-1 所以其中 全0为-127 全1为-128 范围只有127→_→ -126,怎么算这个移码确定的真值呢?首先我们拿到的是2^n-1的移码,其实际表示的真值比普通移码大一个数,所以把这个特殊移码当做普通移码计算,符号位取反算出补码进而算出真值,然后真值+1就好了。

无符号数只有整数,有符号数有小数和整数;在没有溢出的情况下,算术左移和右移的时候符号位是不变的,如果出现溢出的情况,一般都是出现在左移上,对于原码来说,只要最高数值位为1,出现算术左移一定会溢出;对于补码来说,如果符号位和最高数值位是不同的,那么算术左移也会溢出。具体的可以参照关于判定是否溢出的一个标志位即OF,参照双高位判定的条件Ca异或Cb,为1就是溢出,为0就是不溢出,Ca表示的是符号位的进位,就是两个符号位想加是否会进位,进位为1,不进位为2;Cb表示的是两个最高数据位是否会进位,如果会就1,不会就0,那么由于补码是符号位参与运算的,所以算术左移相当于乘以二即两个补码想加,这样一来就可以观察两个最高位的进位,比如1.0或0.1 这样的两个想加,不用管后面的进位,只管这两个,前面的是符号位,后面的是最高数值位,结果要么是前面进位后面不进位,要么是后面进位前面不进位,所以最终是溢出的;再关于原码,因为原码的符号位是不参与运算的,所以默认符号位进位为0,看最高位,如果最高位进位了,那么就是溢出了。注意:Cb的进位要考虑b之前那位数的进位,而Ca的进位要加上Cb的进位,才可以作数。OF还有一个判断方法——常用的:适用于补码的,A的补码符号位a,B的补码符号位为b,运算结果的符号位s,不管是减法还是加法,都是适用的,OF=ab反s+反a反bs。

当但单符号位的时候,溢出的情况只可能出现在两个相同符号位的想加和两个相异符号位的相减,所以当两个相同相同符号的补码相减的时候,可以尽情将减法转换成加法计算,不用担心溢出的问题;而当出现上述会溢出的情况是,也可以将加法转化成减法,只要使用双高位判别一下是否溢出就好了。

上述说了OF的判别,再说一下SF这个就是看符号位是否为负的,负为1,正为0,主要是补码计算的时候看看符号位计算是否为1,如果原码的计算就转化为补码就好了(先判断是否溢出然后判断是否为负)。ZF=1 就是表示值为0,很简单。 CF 只针对于无符号数,表示进位或借位,来表示是否进位或是否不够减,就算是否溢出,CF = sub 异或 最高位进位(数值位),sub=1 就是表示减法,为0表示加法。加法的时候,只要看最高位是否会溢出就好了,减法的时候一定不会溢出,只能是借位,怎么操作呢?由于减法的时候是不可能产生进位的,而且这个最高位的进位是在加法器中产生的,所以只能将无符号整数的减法转换成无符号整数的模加法,比如7-5=7+(8-5)模是2^3,虽然转化了,但是我本质还是减法sub=1,然后也进位了,所以一起异或为0,即没有溢出;如果是5-7=5+(8-7),实质还是减法,但是没有进位,所以这里CF=1,表示的是借位。在有符号整数的时候,也会问到CF的问题将这个有符号整数当做是无符号整数计算就好了,一般都会问你补码的问题,因为补码的符号位可以计算;当补码进行减法的时候,可以转化成补码的加法,和无符号整数转化成模的一样(符号数也是按位取反),不过其中的sub还是1,然后看是否进位,这个进位要看最高位的进位(最高位的进位要看来自次高位进位。),补码的时候即符号位!

总结:OF两种方式,第一种双高位,适用于补码加法器(减法转加法),而第二种刚刚讲的只看起始符号位和结果符号位,不管是补码加减法(不用转,直接手算,转换成真值来看,只要最后结果就可以。)——都适用于补码。

CF将所有的数字看成无符号数,也适用于加法器(减法转加法 sub还是1)

ZF 是否为0,为0就是1 直接判断

SF表示符号,表示结果符号,直接看符号就好了,为1就是负的。

组成原理讨论指令的时候,需要清楚,汇编语言中 直接出现寄存器表示操作的是寄存器中的内容比如add eax ecx;但是如果汇编代码中出现add (eax) (ecx)则表示操作的是内存的内容,即寄存器里面存的内存的地址,这个需要区分;和这个很像的操作就是,在手工写汇编语言含义的时候通常用(eax)表示寄存器里面的内容,而((eax))来表示寄存器里面是内存的地址,实际访问的是内存的内容,这个需要区分。

存储管理中,需要记住cache中的组号,行号,标记号的单位都是bit,表示个数,而块内地址的单位却是B=8bit。

主存地址号和cache的标记项唯一的不同就是,主存中存在的行号和组号在cache被省略了,即cache中只有 有效位,脏位(一致性维护),替换控住位(替换算法控制位),以及标志位(轮数)这四个。

计算cache命中率的时候,按字节编址,并不意味着按字节寻址,即不一定一次只取一个字节,要看起机器字长是多少,如果没说,那么看题目中具体的代码,看看是不是每次取一个int,那么就将int作为每次取的单位即可。

磁盘调度策略中,scan表示电梯策略,增加到头原路原路返回,比如1-10-1,而Cscan是循环策略,到头后从头再来,比如1-10,然后再1-10。

[x]补转成[-x]补的时候,本质是将x真值求出来,比如说2,然后再求-2的补码,但是为了方便就有了 碰到第一个1之后,除了这个1之后全部按位取反,包括符号位,但是遇到特殊情况,比如1.0000000 补码表示-128 这个时候没法用公式,所以直接用定义,表示+128,但是补码最多表示+128,所以就会溢出,要抓住本质。

算关键路径的时候,先算点事件,再算边活动,只有点需要抉择选择,原则是,最早选往前选,最晚往后选,即最早选大的,最晚选小的;边不需要做抉择,最早活动就是最早事件,最晚活动就是等于活动指向的结束点的最晚时间减去活动的持续时间就好了。

文件管理中,文件的逻辑和物理结构指的是其中记录的存储形式。逻辑有:顺序查找,索引查找(不定长变定长),索引顺序查找;哈希查找。(说一下 顺序存储结构,链式存储结构,索引存储结构和散列表是物理结构,这里不知道为啥用作逻辑结构。)物理有:连续分配,链接分配,索引分配,混合索引分配。

其中文件管理中的物理结构就是对已经分配的物理块的管理,而后续还有对空闲块的管理;已经分配块的管理主要是结构上查询的管理,而空闲块的管理主要是物理块分配上的管理。

文件的逻辑结构和物理结构的区别就在于,逻辑结构是面向用户的,用户的认为的寻找方式,是感觉上的;而物理结构是真实的寻找方式,是操作系统隐藏起来的;比如文件逻辑方式是顺序的,但是物理是链接方式,故逻辑上采用折半查找一下就找到了,但是实际上还是一个块一个块寻找。

透明传输的含义中的透明指的是:中间的数据部分对于筛查是否是标志首位和标准末尾的程序来说是透明的,即中间的数据部分(不是两头的界限标志)不管出现什么样的比特组合都可以在链路上传输。

循环冗余码的来龙去脉:要发送一个6位的比特,其阶数就是5。(比特位=阶数+1)有了要发送的比特之后,双方再约定一个除数序列G(x)位数是4,阶数是3。上述的是题目条件。第一步 要发送的6位比特位后面扩展3位(三位是除数序列的阶数),然后除以这个除数(就按照正常的十进制除法公式),除法的规则是异或,也就是写完商之后,之后的上下数字采用异或的方式计算,而不是相减;之后得出一个余数,一定是3位余数(0不可以省略),也就是除数序列的阶数,这个余数就是(FCS帧检验序列),然后将原序列的6位加上帧检验序列(即余数)的3位就变成了含有检验码的数据了,这样就可以发送了。如果发送端使用除数序列检验的话,即相除没有余数的话,那么就是检验合格,就可以了。

海明码的来龙去脉:比如有4位信息,其海明码的位数是k,需要满足4+k+1≤2^k 找到其中的k就好了,或者题目会给出具体的k。比如三位海明码。上述是题目信息。海明码怎么放呢?海明码规定了放置在 2的0次方位,2的一次方位....依次类推,那么这三位分别放在1,2,4位上面,和四位信息位组成了完整的发送信息。怎么确定海明码的数值呢?要知道每个海明码都管着相应的位数,比如1位上的海明码是001二进制,管着最后一位是1的全部数据位,以此类推,2位上是010,管着全部第二位上是1的全部数据位,4就是第三个全是1的数据位。确定好管的数据位,还需要确实是奇检验还是偶检验;一般采用的是偶检验(实质是异或),比如第一位上的海明码采用偶检验的话,就是将其所有管理的数据位全部进行异或 的出来的就是海明码了。得出全部的海明码就组成了需要传送的数据了。那怎么检查错误呢?上面用偶检验计算,这个时候就用偶检验纠错,将海明码和其管理的所有数据位都进行异或会得出一个结果,从第一位海明码开始统计,第二位海明码异或得出来的结果放在第一位海明码的左边,即按照海明码的顺序从大到小排列,最后得出全部的异或结果,比如三个海明码得出三个结果,按照海明码的位序从大到小排列之后,得出一个二进制序列,这个序列的十进制数就是出错的数据位数,只要将出错的位数取反就好了,这样同时完成了检错和纠错。

希尔排序的增量不计算起始的位置,但是计算终点的位置。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值