CE162 Lec01
数制转化
整数转化
- 短除法和位权相加法都能进行这四种进制的相互转换,只是在某些情况下较困难
- 十进制转二、八、十六进制时用短除法
- 二、八、十六进制转十进制时用位权相加法
- 二进制转八、十六进制用合位+位权相加法
- 八、十六进制二转进制用拆位拼接法
- 八进制和十六进制的互相转换用借桥法
十进制转其他
短除法:除以目标进制,保留余数,直到商为0,余数逆序排列为结果
其他转十进制
权位相加法:把各数位乘权的i次方后相加
二进制转八或十六
第一位0表示八进制 0x表示十六进制
合位+权位相加法:从低到高,以3位或4位为一组,高位不够补0,组内用二进制转十进制方法
八或十六转二进制
拆位拼接法:每个数均转化为二进制再拼起来
八与十六互转
借桥法:先转成二或十进制再转(感觉先转成2比较快)
小数转化
十进制转其他
- 小数部分乘目标进制,然后取整,直至乘积为整数或达到精度
- 第一取整数为小数点后第一位
其他转十进制
- 小数部分各位乘权的-i次方后相加
其他转换
- 拆位合位
无符号二进制数运算
加法
感觉确实没有什么要注意的
减法
- 0-1=-11
- 借一为二:借1后就组成10 就是2
乘法
- 正常乘法 注意移位
- 部分积 求和
除法
- 0/1=0
- 1/1=1
- 除数不能为0
- 除尽或达到精度为止
有符号
原码(Sign-Magnitude)
- 正数符号位0 负数符号位1
- 0有两种表示方法
- 1比特(bit)=1位二进制数
- 1字节(byte)=8位二进制数
- 半字节(nibble)=4位二进制数
反码(1’s Complement)
- 正数反码与原码相同
- 负数反码:符号位为1 数值位对应取反
- 0有两种表示方法
补码(2’s Complement)
- 模
- 正数补码与原码相同
- 负数补码:符号位为1 数值位对应取反 最低位加1
- 原→补简便方法:符号位为1 从右找1 留1不变 其余取反
- 反→补简便方法:符号位为1 从右找0 含0取反 其余不变
- 0的表示唯一
- 补码的补码=原码
补码的加减法
- 加法:嗯加
- 减法:(A)补-(B)补=(A)补+(-B)补 转换为加法
- 溢出(Overflow):仅发生在两个相同符号数相加的情况下
- 正溢出:大于最大正数
- 负溢出:小于最小负数
- 数值范围
- 原/反码 -(2n-1-1) ~ +(2n-1-1)
- 补码 -2n-1 ~ +(2n-1-1)
- 溢出判断:最高位进位位与次高位进位位不同时发生溢出
- 最高位进位位为0 次高位为1 正溢出
- 最高位进位位为1 次高位为0 负溢出
- 手算判断法:符号位扩充为两位*(0→00,1→11) 结果符号位为10或01则溢出
补码的乘法(shift-add)(Booth)
阿巴了很久终于会了
-
计算被乘数X和乘数Y的补码 双符号位
-
初始化累加寄存器A为0 双符号位
-
计算被乘数[-X补] 双符号位
-
Yn+1初始化为0
-
A Y Yn+1 (这是算式排布)
-
判断最后两位 进行相应运算操作 (可能会出现进位可以省略 )
Yn(高位) Yn+1(低位) 运算操作 0 0 A补右移 0 1 (A补 + X补)右移 1 0 (A补 - X补)右移 1 1 A补右移 -
右移 除第一位外整体右移 Yn+1为新的第一位 新的第二位根据第三位补
-
循环次数 = Y补有效位数
-
校正时 再根据最后两位进行相应的运算操作
-
去掉Y最后两位 改为单符号位
-
完成!
补码的除法
阿巴了很久很久终于会了
-
不恢复余数除法要求:|被除数X|<|除数Y|
-
计算X补 Y补 [-Y]补 双符号位
-
余数ri 商 (这是算式排布)
-
初始化余数r0=X补 商=0 位数比双符号位补码少两位 缺最后一位
-
比较r0与Y补符号 同号商最后一位商1 异号商0 并进行相应运算操作 (可能会产生进位可忽略)
ri与Y补符号 商 运算操作 同号 1 [ri+1]补 = [ri]补左移 - Y补 异号 0 [ri+1]补 = [ri]补左移 - Y补 -
循环次数 = Y补有效位数
-
商校正 商的首位+1 末位补1 其余不变
-
余数校正 左移n次 r = [rn]补 * 2-n
按位运算
- 置1 0x?? | 0xFF
- 清0 0x?? & 0x00
- 测试是否为1 0x?? & 0xFF
- 测试是否为0 0x?? | 0x00