programming-01 *浮点数与二进制转换
1、十进制与二进制互转:注意分正负数!!!!
- Integer.toBinaryString(-235465)对负数会自动生成32位补码
- 对&操作还是不太了解,避免使用
- 二进制转十进制时,对于负数的补码,可以把+1移到后面,少一步加法
2、十进制与NBCD互转:1100为正,1101为负!!!!同样区分正负数 - 知道符号后剩下的部分无关正负,一个一个取变成4位的Binary
- 不满32位时在符号位和数值位中间补0000
- 转成十进制时注意去掉多余的0
3、浮点数和二进制真值互转:我原来的代码分了有科学记数法和无科学记数法,感觉有问题,这里学习标答写法。 - 准备阶段:处理NaN,正负无穷,0
- 通过最小规格化数分类讨论:
- 若是非规格化数,指数部分全0,剩余数放大2^126再用小数化二进制的方法得阶码
- 若是规格化数,需要移动的位数即为exponent,再算出指数(exponent+bias)并更新d,最后再用小数化二进制的方法得阶码
- 注意把小数转成二进制时不要单纯的只留23位,要多留几位保证精度(非规格化可能会左移)
二进制转浮点数则简单不少:
对上面问题的标答补充:(不用toBinaryString的方法)
模拟加法器
programming-02 *CRC循环冗余校验
生成多项式的最高位是几,就左移几位,这里是3
- 生成校验码:先左移,再除以多项式,难点在于除法的实现
重难点在:
0可以省略,不一定要专门设一个result的string(因为只要余数),异或操作
我的方法:没必要递归让代码复杂了,这个方法就是省略掉0然后一步步算,如果剩下的数位数少了,就得余数并跳出(newRes存的是最后的余数)。
这里显然可以共用算余数的函数,所以比较简单。