基础知识
- 位(bit、比特):计算机内存储和处理信息的最小单位,值只能为0或1,不可再细分
- 字:一组或一串比特
- 字节(byte):8个二进制位
根据计算机厂商不同,有以下商用术语
- 字(word):16位
- 长字:32位
或者 - 字(word):32位
- 半字:16位
重要概念
- 表示范围:一个数能表示的最大值和最小值之间的值
- 精度:数据表现得多好得衡量标准
- 准确度:测量值为51.32,实际值为51.34,则准确度为0.02
- 误差:真实值-测量值
字符编码
- 计算机都是面向字节的
- ASCII码(7位):
- 前32位不可打印,用于完成回车、退格、换行等
- 剩余96个字符可打印
- ISO 8859-1拉丁编码(8位)
- Unicode编码(16位):
- 前256个字符被映射到ASCII字符集
- 这是Java字符的标准方法
图像、声音和视觉
- 像素:8位(单色)或24位(三基)
所以可以看到某些软件颜色表示为 #000000 代表黑色 #FFFFFF 代表白色 以上为十六进制数,6位16进制即24位2进制
- 精确编码(数据):存储和处理都不会丢失信息,称为无损的
- 有损编码(图片和声音):如MPEG、JPEG、MP3,编码会造成不可逆的质量损失
有符号整数
符号及值表示法
第一个0代表正数,1代表负数,后面7位是值
0 0001101=+13
1 0001101=-13
- 缺点
①0 0000000和1 0000000都代表0
②加法用加法器,减法用减法器
二进制补码运算(微处理器使用二进制补码系统表示有符号整数)
- 补数:一个数和它的补数之和为一个常数,如一个4位二进制数可以表示0000–1111之间的数,即十进制0–15(共16个值),那么16就是这个常数,3的补数是13
- 二进制求补数:各位取反加1,如1011(11),各位取反0100,加1,即0101(5),原理如下
- 如果一个n位二进制数N,其补数为2n-N
- 假设n=4,则2n-N=8-N,8-N用二进制表示为10000-N
- 10000-N=10000-1-N+1=1111-N+1
- 此时对于N,如果有N=5,则表示为0101,1111-0101=1010,即1111-N的结果就是N的各位取反
- 最后再+1
- 该算法特别适合用硬件实现!
减法:
- 用二进制补码表示时,A-B可以看成A加上B的补数
0111(7)-0101(5) 可以看成 7 加上 5 的补数 0101(5)的补数为1011(11)
- 注意!虽然0101(5)的补数为1011(11),但是在计算时,必须将1011看成“补码表示”,即1011代表-5,而不是11
0111(7)+1011(-5)=2
运算溢出:
- 两个正数合为负数,两个负数和为正数,即操作数A、B符号相同,但结果符号与它们不同时,则发生了运算溢出
移位运算:
- 左移,空出的最低为补0,移出的最高位保存在“进位标识”中
- 右移,空出的最高位补符号位,移出的最低位保存在“进位标识”中
- 进位标识:计算机的一个存储单元
左移:左移一位等价于该数乘以2
右移:左移一位等价于该数除以2
0011(3)左移一位0110(6)
1101(-3)左移一位1011(-6)
0110(6)右移一位0011(3)
1011(-6)右移一位1101(-3)
当一个数左移或者右移时,如果超出表示范围时,则运算溢出,如
0000~1111表示-8~+7,如果是
0101(5),左移翻倍,则应该是10,已经超出-8~+7的范围,所以会有
0101(5)左移一位1010(-6),而不是预期结果10,负数同理
1010(-6),左移范围,应该是-12,超出范围,有
1010(-6)左移一位0100(4),而非预期的-12
无符号二进制乘法
-
算法一:要求计算机存储n个部分积,然后将他们累加
两个n位二进制数相乘会得到一个2n位的积 1 0 1 0(10) X 1 1 0 1(13) ———————————————— 1 0 1 0 0 0 0 0 1 0 1 0 1 0 1 0 ———————————————— 1 0 0 0 0 0 1 0 (130)
-
算法二:每得到一个部分积就做一次加法
-
计算机实际应用多种方法加快运算(如:构造专门的逻辑阵列直接得到两数的积)
有符号二进制乘法
算法一:矫正因子(矫正因子的存在使得该算法变慢)
- 假设正数X与负数-Y相乘,结果为-XY
- 二进制补码表示X,仍是X
- 二进制补码表示-Y,Y的补数(2n-Y)用二进制补码表示是它的相反数-Y,所以-Y的二进制补码表示为2n-Y
- 则有X和-Y相乘的二进制补码表示X·(2n-Y)=2nX-XY,而理论值应该是22n-XY,所以需要矫正因子使得2nX-XY+矫正因子=22n-XY
- 所以矫正因子为2n(2n-X)
算法二:布斯乘法
-
两个二进制数的乘法存在以下规律,比如M • 58
58=32+16+8+2(25+24+23+21)
-
然后又可以根据次方的连续性分为几部分
543是一组,即25+24+23
1自己为一组,即21 -
对各部分进行变型
21=22-21(第一部分)
25+24+23=26-23(第二部分) -
因此有M • 58=M •(25+24+23+21)=M •(26-23+22-21)
-
此时再让我们看下布斯乘法的原则
①当前位为1,下一位为0,则部分积减去被乘数
M • 00111010
-M • 21
②当前位和下一位现同,什么都不做
③当前位为0,下一位为1,则部分积加上被乘数
M • 00111010
+M • 22 -
当①②③条原则相结合,会发现,他们实际上是圈起来一个次方连续性的一部分,上述圈起来的是
M • 00111010
而该部分可以被表示为-M • 21+M • 22=M •(22-21),发现这不就是第一部分吗! -
继续执行原则
①当前位为1,下一位为0,则部分积减去被乘数
M • 00111010
-M • 23
②当前位和下一位现同,什么都不做
M • 00111010
M • 00111010
③当前位为0,下一位为1,则部分积加上被乘数
M • 00111010
+M • 26 -
同理,被圈起来的是
M • 00111010
而上述被圈起来的部分可以被表示为-M • 23+M • 26=M •(26-23),这就是第二部分!
算法三:用加法代替,比如
- 10P=2 • (2 • 2 • P+P):即左移两次,加P,再左移一次
- 9P=2 • 2 • 2 • P+P:即左移三次,加P
除法
略
浮点数
概念
- 浮点数:顾名思义,小数点位置不固定
- 组成:①数值;②小数点在数值中的位置
- 二进制浮点数表示:尾数 • 2指数
IEEE754浮点数标准
①32位单精度浮点数
②64位双精度浮点数
③128位四精度浮点数
规格化浮点数
①最高位总是1
1.101010......
1.001001......
②所有位数都是有效的
规格化:1.0101001,所有位都有效
非规格化:0.000101001,前四位无效
③充分利用了可用的最大精度
2~2~