LAB1 - 数据表示实验


简介

本实验的目的是更好地熟悉和掌握计算机中整数和浮点数的二进制编码表示及其操作。实验中,你需要解开一系列编程“难题”——使用有限类型和数量的运算操作实现一组给定功能的函数。

实验数据

实验所需要的代码和相关文件已打包成一个TAR文件“datalab_ics17s.tar”,将其下载到实验Linux系统的特定目录中,再使用命令“tar xvf datalab_ics17s.tar”提取出其中的实验数据文件。 TAR文件中主要包含以下文件:

实验要求

实验前请认真阅读本文档和bits.c中的代码及注释(特别是bits.c前面部分的编程说明与示例),然后根据要求相应完成bits.c中的各目标函数的实现代码。 实验中实现的函数代码必须满足下述基本条件: 除上述一般性要求外,非浮点数函数还必须满足下列要求: 浮点数函数还必须满足下列要求: 上述实验要求的主要目的是使得你必须从二进制位的角度考虑数据,进而更清楚地理解数据的二进制表示。

实验结果提交

请将包含函数实现代码的bits.c重命名为“你的学号-bits.c”,并作为实验结果提交。

注意:提交前务必按照本文档后面有关"检查你的代码"的说明,核实bits.c可正确编译且实现了各包含函数功能后再提交。


实验内容

你需要完成bits.c中一系列目标函数的功能,函数分为三大类:位操作、补码运算和浮点数操作。

位操作 bitXor, allOddBits, replaceByte, conditional, rotateRight, bang, bitParity, greatestBitPos
补码运算 rempwr2, isGreater, ilog2, trueFiveEighths
浮点数操作 float_neg, float_f2i, float_half

注意:

函数示例

/* 
 * bitAnd - x&y using only ~ and | 
 *   Example: bitAnd(6, 5) = 4
 *   Legal ops: ~ |
 *   Max ops: 8
 *   Rating: 1
 */
int bitAnd(int x, int y) {
  return 2;
}

函数前的注释部分描述了函数的功能目标和实现要求。其中:

你的任务是将函数体中的“return 2;”替换为你用以实现函数功能的代码。 你也可参考tests.c中对应的测试函数来了解所需实现的功能,但是注意这些测试函数并不满足目标函数必须遵循的编码约束条件,只能用做关于目标函数正确行为的参考。


【重要!】检查你的代码

如前所述,实验数据包中包含两个工具程序可帮助检查你的代码的正确性。因此,在提交实验结果前务必使用该工具确认结果正确

使用dlc检查函数实现代码是否符合实验要求中的编码规则

完成bits.c后,调用如下命令进行检查:
 $ ./dlc bits.c 
dlc将返回错误信息如果它发现了错误,例如不允许使用的操作符、过多数量的操作符或者非顺序的代码结构。如果程序代码满足规则要求,dlc将不输出任何提示。 使用-e选项调用dlc
 $ ./dlc -e bits.c 
可使dlc打印出每个函数使用的操作符数量。 输入“ ./dlc -help”可打印出dlc的可用命令行选项列表。

使用btest检查函数实现代码的功能正确性

首先使用如下命令编译生成btest可执行程序:
 $ make 
如下调用btest命令检查bits.c中所有函数的功能正确性:
 $ ./btest 
注意每次修改bits.c后都必须使用make命令重新编译生成btest程序。 为方便依次检查测试每一函数的正确性,可如下在命令行使用“-f”选项跟上函数名,以要求btest只测试所指定的函数:
 $ ./btest -f bitXor 
进一步可如下使用“-1, -2, -3”等选项在函数名后输入特定的函数参数:
 $ ./btest -f bitXor -1 7 -2 0xf 
(README文件中有关于btest程序的使用说明)

【重要!】建议与提示