前言
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 0x27Hex = 0x00000027, Signed = 39, Unsigned = 39unix> ./ishow 27Hex = 0x0000001b, Signed = 27, Unsigned = 27unix> ./fshow 0x15213243Floating point value 3.255334057e-26Bit Representation 0x15213243, sign = 0, exponent = 0x2a, fraction = 0x213243Normalized. +1.2593463659 X 2^(-85)linux> ./fshow 15213243Floating point value 2.131829405e-38Bit Representation 0x00e822bb, sign = 0, exponent = 0x01, fraction = 0x6822bbNormalized. +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浮点数表示
- 真的从实验中收获知识与快乐
不要过于纠结于验收形式(验收分数差异真的不大)