前言
datalab考验对于位运算以及浮点数存储的理解,如果真的肯花时间去搞懂,对计算机系统存储的理解真的能上一个台阶。与课程考试关联性上来说不是很大,但对于IEEE的浮点数表示一定要熟练掌握。
导引
①实验工具包
要完成的是bits.c中的15个函数。
打开README可以查看实验提供的工具包中各部分是干什么作用的,摘录如下。
- bits.c- ★完成这个文件中的15个函数
- bits.h- 头文件
- btest.c- 主btest程序(用于测试结果)
- btest.h,decl.c,tests.c,tests-header.c- 用于生成btest
- fshow.c-用于检查浮点表示的实用工具
- ishow.c-用于检查整数表示的实用工具
- dlc -编译器
②实验完成流程
重复以下三个步骤直至完成15个函数并且结果都正确,实验结束。
- 补全bits.c中的某一个函数
- 【编译检验】使用./dlc bits.c 测试是否通过编译(即是否合法),若没有问题则没有返回
- 【结果检验】使用make clean && make btest && ./btest 测试结果是否正确,会输出错误信息和正确信息
注:每次改动bits.c后均需重新make clean && make btest,这里的&& 可以直接敲上去,命令行会默认逐个执行&&连接的语句,或者自行拆分逐个敲语句也可以。
【可选】使用./dlc -e bits.c打印每个函数使用的运算符数,操作数也需要满足限制。
【可选】小工具ishow和fshow,可以用来看一个数在int类型和float类型下有无符号形式的值。
unix> ./ishow 0x27
Hex = 0x00000027, Signed = 39, Unsigned = 39
unix> ./ishow 27
Hex = 0x0000001b, Signed = 27, Unsigned = 27
unix> ./fshow 0x15213243
Floating point value 3.255334057e-26
Bit Representation 0x15213243, sign = 0, exponent = 0x2a, fraction = 0x213243
Normalized. +1.2593463659 X 2^(-85)
linux> ./fshow 15213243
Floating point value 2.131829405e-38
Bit Representation 0x00e822bb, sign = 0, exponent = 0x01, fraction = 0x6822bb
Normalized. +1.8135598898 X 2^(-126)
最终可用./driver.pl来进行总体验证,得出最终分数。
③举例
1 bitAnd
/*
* bitAnd - x&y using only ~ and |
* Example: bitAnd(6, 5) = 4
* Legal ops: ~ |
* Max ops: 8
* Rating: 1
*/
bits.c函数上方的注释中标注了完成该函数的要求以及函数功能描述。
这个函数要求使用按位或和按位取反实现按位与,最多使用的符号数目是2个。
思路:使用德摩根定律将“按位与”操作转换为“按位取反”和“按位或”操作。
因此我们可以这样完成这个函数。
int bitAnd(int x, int y)
{
return ~(~x | ~y);
}
注意:1-12依据各函数要求;13,14,15允许使用if,while等语句进行编写。
④期望
希望你能:
- 独立完成实验,思路清晰
- 进行经验总结,探究感悟
- 熟练掌握IEEE浮点数表示
- 真的从实验中收获知识与快乐
不要过于纠结于验收形式(验收分数差异真的不大)
⑤ 运行时BUG解决1-/usr/include/stdio.h:27:10: fatal error: bits/libc-header-start.h: No such file or directory
有同学在使用make btest时遇到问题如下
该问题产生的原因及解决方法如下:
即可正常运行。
⑥运行时BUG解决2-fitsBits一个测试过不了
顺便解决遇到这个问题
解决方法:
【注】若两个问题同时遇到,该行的-O和-m32都要关掉
该问题解决
【注】以上两个bug同时常出现于:环境发生迁移时,如虚拟机环境/docker环境/WSL子系统环境等。所以部分同学可能未遇到,部分同学遇到,这取决于你的环境。具体原因应该是架构上的问题,不去深究。
验收
总体思路:
说是实验验收,实际上主要确保同学能掌握两个点,一个是位运算,第二个是IEEE浮点数的表示。后者是主要的任务,必须确保每个同学掌握了,因为期末考试第一题往往就是这个知识点。
我的验收流程:
- 从1-13的题目中挑选1-3个印象深刻的,讲讲是怎么做的。
- 从14-15的题目中挑选1个,主要涉及到浮点数。必须确保掌握IEEE的基本知识。
【主要根据讲解思路,判断是否是自己完成的,比较热门的题目有isLessorEqual,bitcount,ilog2】
部分题目的主要问题:
isLessorEqual:
- 为什么要先比较是否同号再进行相减?【防止数据过大导致溢出】
bitcount:
- 简述思想
- 给你一组数据,对这个数据按照你的算法进行实操。
- 如果是用掩码的方法,这一步的掩码是什么。
- 这是一种什么思想?分治/二分
ilog2:
- 简述思想
- 给你一组数据,对这个数据按照你的算法进行实操。
- 这是一种什么思想?分治/二分
i2f:
- IEEE的浮点数的符号位,阶码,尾数,是怎么来的
- 向偶舍入是怎么处理的
float*2
- 浮点数的类型都有哪几类:规格化数,非规格化数,无穷,NAN
- 对于规格化数怎么处理,对于非规格化数怎么处理
验收总结
主要还是确保同学们都会相关知识点了,所以就没有深入问。基本能确保同学是自己做的,然后对我关注的知识点都了解了,我就停止继续问了。同学的表现都还是比较好的。
参考: