aboutsummaryrefslogtreecommitdiff
path: root/README.md
blob: e09b9b24b1c9cc78766feb4bc8c763de12f8229e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
# DataLab

```
 ________  ________  _________  ________  ___       ________  ________     
|\   ___ \|\   __  \|\___   ___\\   __  \|\  \     |\   __  \|\   __  \    
\ \  \_|\ \ \  \|\  \|___ \  \_\ \  \|\  \ \  \    \ \  \|\  \ \  \|\ /_   
 \ \  \ \\ \ \   __  \   \ \  \ \ \   __  \ \  \    \ \   __  \ \   __  \  
  \ \  \_\\ \ \  \ \  \   \ \  \ \ \  \ \  \ \  \____\ \  \ \  \ \  \|\  \ 
   \ \_______\ \__\ \__\   \ \__\ \ \__\ \__\ \_______\ \__\ \__\ \_______\
    \|_______|\|__|\|__|    \|__|  \|__|\|__|\|_______|\|__|\|__|\|_______|
```

模板仓库:[RUC Datalab-2025Fall](https://github.com/RUCICS/Datalab-2025Fall)

## 项目编译与环境指南

C 语言编译环境

```bash
sudo apt-get update
sudo apt-get install build-essential
sudo apt-get install gcc-multilib
```

如果有 C 语言环境问题,你可以选择删除 `gcc` 和 `g++` 然后重新执行上述指令。

```bash
sudo apt-get remove gcc g++
```

如果仍有问题,可以联系林瞻涵助教获取服务器登陆信息,在服务器上完成本实验。

如果你想获得 VSCode 的最佳代码提示体验,请指定 `cStandard` 为 `gnu99`:

```json
{
    "C_Cpp.default.cStandard": "gnu99"
}
```

> 面向高级用户,我们还提供了 devcontainer 的支持。有需要的同学可以自行使用。

### 如何编译

```bash
make
```

> 如果你不懂什么是 `make`,请询问 AI 生成工具 “什么是 make,我应该在什么时候执行 make,make 的原理是什么”

### Quick Start

```bash
# 在我们的服务器上,不需要执行这一行
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`](./bits.c) 文件中。

### 一个例子

```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` 题目中,你需要修改代码,使得:

1. 保证函数的返回值符合要求
2. 保证只使用了 `Legal ops` 中给出的符号
3. 符号数的总数不能超过 `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` 这种关键字,但例如条件表达式内的符号还是会被计算

### 如何评测

```bash
python3 test.py
python3 test.py -V # 显示更多信息
```

我们提供了一个 `test.py` 脚本,它完成以下判断:

- 尝试编译你的代码
- 测试正确性,即是否能返回函数正确的结果
- 测试合规性,即是否满足题目对符号数等的要求

该脚本要求你的代码不能包含输出到 stdout 的调试输出,如果你需要调试,请用下文的 `btest` 脚本。
通常情况下,你可以只用 `btest` 测试,直到所有函数都能返回正确结果,再回到 `test.py` 测试。

输出示例:

```bash
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` 脚本的一部分,你可以根据需要单独使用它以方便调试。

执行正确性测试

```bash
make
./btest
```

以指定参数调用某个函数测试:

```bash
make
./btest -1 1 -2 2 -f bitXor # bitXor(1, 2)
./btest -h # 查看 btest 的其他功能
```

#### ishow

```bash
./ishow 0x27
Hex = 0x00000027,	Signed = 39,	Unsigned = 39
```

#### fshow

```bash
./fshow 0x15213243
Floating point value 3.255334057e-26
Bit Representation 0x15213243, sign = 0, exponent = 0x2a, fraction = 0x213243
Normalized.  +1.2593463659 X 2^(-85)
```

### 最终得分

DataLab 本次设置为通过性实验,即测试点通过则为满分。

## 提交

提交方式为在obe上填写你fork的仓库地址,且之后助教会组织答辩验收

## 注意事项

1. 不允许抄袭,助教会将每个人代码同网上代码和其他同学代码进行查重
2. 报告需要写清楚做题思路,否则会酌情扣分
3. 慎用代码格式化工具,如果一定要使用,请用 [`.clang-format`](./.clang-format) 文件,如果因格式化工具导致 `bits.c` 外的文件被修改,可能会被视为作弊