计组-原码、反码、补码、移码、浮点数、校验码
码制-原码、反码、补码、移码
- 原码:符号位+数值位。直观,但是运算较为困难,加法和减法需要采取不同的硬件实现方式;0有+0和-0两种表达方式。
- 反码:正数的反码:原码,负数的反码:原码的数值位取反。0有+0和-0两种表达方式
- 补码:正数的补码:原码,负数的补码:反码数值位+1。能将减法运算转换为加法运算,使得加减法能采用同一套硬件实现;0的表示唯一
- 移码:补码的符号位取反(不区分正负数)。和补码一样,方便运算;且整体大小单调递增,用于表示浮点数的阶码;0的表示唯一
表示范围
- 原码和反码一样,补码和移码一样。后者比前者在负数上多表示一个数,原因是前者的0有两种表达方式。
- 从0开始,因此最大值都要减一
- 小数是对整数都除以2^(n-1)
规格化
- 对于规格化浮点数小数点后第一个值是固定的(正数:1,负数:原码1,补码0)
- 目的:为了提高精度需要使尾数的有效位数尽可能占满可用的位数。这种措施称为浮点数的规格化。
- ref
浮点数
- 浮点数在计算机中的表示
- 浮点数表示时,尾数使用纯小数(有的是0.xxx的小数,有的是1.xxx的小数)
1 | |<-----j-------->|<--------S-------->| |
- 例如-28.75,用1位阶符、5位阶码、1位数符、8位尾数,阶码和尾数都采用原码表示,则可以表示如下:
1
2
3
4
5
6(-28.75)base10
= (-110100.11)base2
= -1 * (0.11010011)base2 * 2^5
阶符 jf = 0, 阶码 j1j2j3j4j5 = 00101 = 5, 数符 Sf = 1, 尾数 S1S2...S8 = 11010011
结果:
0 00101 1 11010011
表示范围
- 先确定阶码位和尾数位是用什么码制表示。尾数的最大最小值分别和阶码最大值相乘即可。
- IEEE-754
- 尾数的规格化方式:省略了开头的“1.”,即M表示的是1.M
- 阶码表示以2为底的阶数,用移码表示,但需要注意的是,这里的移码不能采取将补码的最高位取反的方式获得,这是因为把补码的最高位取反,相当于增加了1000…00的偏置量,而IEEE 754标准下的偏置量是0111…11,也就少了一个1。之所以这样设计,是为了保留阶码全0或者全1的情况,以用作特殊用途。
- 因此,以float型浮点数转化为十进制数的计算公式为:
1 | +------|-----------------------|----------------------+ |
浮点数运算
校验码
- 码距/海明距离:任意两个码字之间最少变化的二进制位数
奇偶校验码
- 分奇校验和偶校验
- 预留一位作为校验位,以奇校验为例,值为1则说明有奇数个1,反之有偶数个1
- 只能检错不能纠错、且只能检验出奇数个数据改变的场景
海明校验码
- 一种多重奇偶校验码。
- 实现原理:在有效信息位中加入几个校验位形成海明码,并把海明码的每一个二进制位分配到几个奇偶校验组中。当某一位出错后,就会引起有关的几个校验位的值发生变化。
- 特点:可以发现错误,定位错误位置,自动纠正错误。 可以检测双比特错误,但只能纠正单比特错误。
纠错理论:L-1=D+C且D≥C:编码最小码距L越大,其检测错误的位数D越大,纠正错误的位数C也越大,且纠错能力恒小于检错能力
- case
hammingcode1.png
循环冗余校验码(Cyclic redundancy check, crc)
- CRC码共N位:K位信息位后拼接R位校验码。K+R=N,也称(N,R)码。
- 可以发现错误,定位错误位置,自动纠正错误。可检测/纠正出所有奇数位错,所有双比特的错和所有小于、等于校验位长度的突发错
- 发送端和接受端会有一个生成多项式G(x)约定,生成多项式G(x)的最高次幂为R。任意一个二进制数码都可用一个系数为0或1的多项式与之对应。比如:二进制数码 1101 对应的G(x)=1X^3+1X^2+0X^1+1X^0= X^3+X^2+1
- 在发送端,将要传送的K位二进制信息码左移R位,将它与生成多项式G(x)所对应的的二进制数码进行模2除法(按位异或),产生余数,生成一个R位检验码,并附在信息码后,构成一个新的二进制码(CRC)码,共K+R位。
- case
存储系统 & 存储管理
存储结构
- 存储器层次结构的思想是上一层次的存储器是低一层次的高速缓存。
- 越接近cpu的存储器速度越快容量越小,越远离cpu的存储器速度越慢容量越大。
- 高速缓冲技术是利用程序访问的局部性原理,把程序中正在使用的部分存放在一个高速的、容量较小的Cache中,使CPU的访存操作大多数针对Cache进行,从而大大提高程序的执行速度。
局部性原理
- 空间局部性:一个存储位置被访问后,其周围的位置也倾向于被访问。
- 时间局部性:一个存储位置倾向于被多次访问(类似循环体中的变量)。
- 程序越满足局部性,其执行效率越高。例如GRU的缓存机制利用了时间局部性,prefetch利用了空间局部性的思想。
cache置换算法
- 随机算法:几乎没意义
- 先进先出:一定意义
- 近期最少使用 least recently used : lru 使用最广泛,把数据加入一个链表中,按访问时间排序,发生淘汰的时候,把访问时间最旧的淘汰掉。。利用hash表(实现O(1)的访问)和双向链表(实现O(1)的add/delete)。
- 查询某个key,没有则返回-1,有则返回,并移动到链表头。
- 新增某个元素,新增在链表头,若链表满,delete链表尾的元素。
- LRU对于循环出现的数据,缓存命中不高。例如1,1,1,2,2,2,3,4,1,1,1,2,2,2…..
- 最不经常使用页置换 least frequently used : 把数据加入到链表中,按频次排序,一个数据被访问过,把它的频次+1,发生淘汰的时候,把频次低的淘汰掉。
- lfu 问题在于可能前期用的多,后期不用,就会占住内存不释放。LFU对于交替出现的数据,缓存命中不高,例如1,1,1,2,2,3,4,3,4,3,4,3,4,3,4,3,4……