DataLab
________ ________ _________ ________ ___ ________ ________
|\ ___ \|\ __ \|\___ ___\\ __ \|\ \ |\ __ \|\ __ \
\ \ \_|\ \ \ \|\ \|___ \ \_\ \ \|\ \ \ \ \ \ \|\ \ \ \|\ /_
\ \ \ \\ \ \ __ \ \ \ \ \ \ __ \ \ \ \ \ __ \ \ __ \
\ \ \_\\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \____\ \ \ \ \ \ \|\ \
\ \_______\ \__\ \__\ \ \__\ \ \__\ \__\ \_______\ \__\ \__\ \_______\
\|_______|\|__|\|__| \|__| \|__|\|__|\|_______|\|__|\|__|\|_______|
模板仓库:RUC Datalab-2025Fall
项目编译与环境指南
C 语言编译环境
sudo apt-get update
sudo apt-get install build-essential
sudo apt-get install gcc-multilib
如果有 C 语言环境问题,你可以选择删除 gcc 和 g++ 然后重新执行上述指令。
sudo apt-get remove gcc g++
如果仍有问题,可以联系李甘助教获取服务器登陆信息,在服务器上完成本实验。
如果你想获得 VSCode 的最佳代码提示体验,请指定 cStandard 为 gnu99:
{
"C_Cpp.default.cStandard": "gnu99"
}
面向高级用户,我们还提供了 devcontainer 的支持。有需要的同学可以自行使用。
如何编译
make
如果你不懂什么是
make,请询问 AI 生成工具 “什么是 make,我应该在什么时候执行 make,make 的原理是什么”
Quick Start
# 在我们的服务器上,不需要执行这一行
sudo apt-get update && sudo apt-get install build-essential gcc-multilib
# 其中 annaFJM 改成你的用户名
git clone git@github.com:RUCICS/datalab2025fall-annaFJM.git
cd datalab2025fall-annaFJM
make
python3 test.py
# 然后你应该看到最后一行输出 Total Points:0 的字样
实验简述
本实验考察对数的二进制表示和位运算的认识。具体来说,本实验会给出多个函数要求实现,比如求两个数的异或,但你只能用限制范围内的位运算操作符(有时候允许更多)。
我们的题目和你们要完成的函数都在 bits.c 文件中。
一个例子
/*
* bitAnd - x & y using only ~ and |
* Example: bitXor(4, 5) = 1
* Legal ops: ~ |
* Max ops: 7
* Difficulty: 1
*/
int bitAnd(int x, int y) {
return ~(~x | ~y);
}
如在 bitAnd 题目中,你需要修改代码,使得:
- 保证函数的返回值符合要求
- 保证只使用了
Legal ops中给出的符号 - 符号数的总数不能超过
Max ops
具体要求
你被允许:
- 对于整型题目,即
float_i2f之前的题目,你被允许定义int变量,即不能定义unsigned,除非题目允许 - 对于浮点数题目,即
float_i2f及之后的题目,你被允许定义int和unsigned的变量
你被禁止:
- 禁止使用控制流语句,比如
if,else,for,while,除非题目允许 - 禁止使用非位运算符号,比如
&&,||,-,?:,!,>,==除非题目允许 - 禁止使用其他不在
Legal ops中的操作符 - 特别说明,例如
<<=,++这类x = x ? 1的?=符号,我们视作?符号,换句话说,只要?在Legal ops里,则?=也在。 - 禁止超过
Max ops个符号数 - 禁止使用函数,或调用任何函数
- 禁止使用宏
- 禁止定义其他类型的变量,比如
float,char,结构体,数组,联合体等 - 禁止使用类型转换:
- 我们绝对禁止显式类型转换,如
(float)x和(int)(1.0f) - 对于隐式类型转换,如果你感觉你的解法利用了隐式类型转换,那你应该尽量避免;如果你的解法不依赖于该隐式类型转换,则无所谓。如有符号数和无符号数计算时,有符号数会被隐式类型转换为无符号数
- 我们绝对禁止显式类型转换,如
- 禁止使用任何浮点常量,比如
1.0f,当然你可以使用它的二进制形式代表的整数,注意不要违反上一条规则 - 禁止使用 Undefined Behavior,比如对一个 32 位数逻辑右移超过 31 位,你应该假设我们的机器会在这时候返回不确定的结果,不得利用 Undefined Behavior,以免我们跨平台编译的时候结果不一致
- 我们要求你的编译不能有任何警告,在迫不得已的情况下,请尽量用一些代码内编译器指令来消除警告,比如
__attribute__((unused)) - 禁止修改除了
bits.c以外的文件 - 禁止给
bits.c文件添加任何头文件,这会导致测试错误。这不影响你使用printf函数, 但使用printf函数会与test.py脚本冲突,你可以使用下文的btest脚本来调试正确性, 正确性通过后再删除printf使用test.py脚本来测试合规性
其他事项:
- 符号数计数不包括赋值等号
=和控制流语句如if,for这种关键字,但例如条件表达式内的符号还是会被计算
如何评测
python3 test.py
python3 test.py -V # 显示更多信息
我们提供了一个 test.py 脚本,它完成以下判断:
- 尝试编译你的代码
- 测试正确性,即是否能返回函数正确的结果
- 测试合规性,即是否满足题目对符号数等的要求
该脚本要求你的代码不能包含输出到 stdout 的调试输出,如果你需要调试,请用下文的 btest 脚本。 通常情况下,你可以只用 btest 测试,直到所有函数都能返回正确结果,再回到 test.py 测试。
输出示例:
bitAnd 1/1: PASS detail: Pass using 4 operations including {'|', '~'} and {'int'}.
bitXor 0/1: FAIL error1: Test bitXor(-2147483648[0x80000000],-2147483648[0x80000000]) failed. Gives 2[0x2]. Should be 0[0x0]
...
Total points: 1/37
该输出展示了一份正确第一个函数的作业。
-V参数会显示通过的函数所用操作符数量,但可能导致你的报错不明显,默认我们只显示 FAIL 的信息。
如何使用我们提供的工具
btest
btest 是正确性检验工具,是 test.py 脚本的一部分,你可以根据需要单独使用它以方便调试。
执行正确性测试
make
./btest
以指定参数调用某个函数测试:
make
./btest -1 1 -2 2 -f bitXor # bitXor(1, 2)
./btest -h # 查看 btest 的其他功能
ishow
./ishow 0x27
Hex = 0x00000027, Signed = 39, Unsigned = 39
fshow
./fshow 0x15213243
Floating point value 3.255334057e-26
Bit Representation 0x15213243, sign = 0, exponent = 0x2a, fraction = 0x213243
Normalized. +1.2593463659 X 2^(-85)
最终得分
DataLab 本次设置为通过性实验,即测试点通过则为满分。
实验报告
作为本学期的第一个实验,我们在此说明我们每个实验的报告提交要求。
首先,所有实验都遵循相同的通用要求,具体见 report/README.md。
每个实验又会提供专用的实验模板,其中包含了具体助教想要你们填写的内容,具体见 report/DataLab.md。
提交
将仓库 push 到上游 Github 仓库里即可完成提交。
注意事项
- 不允许抄袭,助教会将每个人代码同网上代码和其他同学代码进行查重
- 报告需要写清楚做题思路,否则会酌情扣分
- 慎用代码格式化工具,如果一定要使用,请用
.clang-format文件,如果因格式化工具导致bits.c外的文件被修改,可能会被视为作弊