更新历史
20200911
开始做这个实验20200915
更新文章-题目更新到isTmax20200918
更新文章-题目更新到isAsciiDigit20200927
更新文章-题目更新到isLessOrEqual- 停止更新
该实验的目的
该实验的目的是提升对计算机基础信息的理解和操作,例如位,整数,浮动,补码等等。
搭建环境
环境的搭建很简单,我们遵循以下几个步骤即可
- 下载VM Box,并安装ubuntu
- 然后我们在虚拟机中更新环境,在终端中执行一下命令
//更新apt软件源
apt-get update
//安装sudo
apt-get install sudo
//安装c/c++编译环境,build-essential软件包列表内包含libc6-dev、libc-dev、gcc、g++、make、dpkg等
sudo apt-get install build-essential
//补充gcc的完整环境(gcc-multilib)
sudo apt-get install gcc-multilib
//安装gdb
sudo apt-get install gdb
- 然后我们就可以愉快的写代码了,你可以使用VS Code
如何使用正确的姿势写代码和测试
主要是一下几个步骤:
- 阅读
bits.c
的注释,然后在代码处修改它 - 命令行运行
./dlc -e bits.c
查看自己用了多少操作符,以及是否有代码风格问题 - 使用终端,执行
make clean && make btest
编译文件 - 使用终端,执行
./btest
,检查自己是否做对了 - 最终运行
./driver.pl
获得打分
下面是对主要文件的解释:
- bits.c:这个是题目文件,也是我们写代码的地方,同时里面包含着各种要求,做题时需要仔细查看该题的限制。
- btest.c:测试代码的工具,编译它(使用终端
make btest
)我们可以获得可执行文件,执行它会对你的代码进行测试,注意每次修改完代码之后都需要重新编译btest.c
。上面显示了你哪些题目通过测试了,哪些题目没有通过测试,同时也给出了没有通过测试的原因。 dlc(data lab compiler)
:
实验开始
采用以下框架来记录
- 题解(题目解读)
- 代码(包含注释)
- 思路
- 对于本次实验的思考和总结
bitXor
题解:
只用~和&实现一个异或门
//1
/*
* bitXor - x^y using only ~ and &
* Example: bitXor(4, 5) = 1
* Legal ops: ~ &
* Max ops: 14
* Rating: 1
*/
int bitXor(int x, int y) {
return 2;
}
思路:
在解这道题目的时候我首先想到的是在《编码》当中实现的异或门
,异或门
是由三个逻辑门构成的,分别是与门
,或门
,非门
构成的。如下图所示
而在这个题目当中,限制了我们使用或门
,使得我们不得不自己使用与门
和非门
组合成一个或门
。
然而要想实现一个或门
我们就得先观察或门
的关系表
Or | 0 | 1 |
---|---|---|
0 | 0 | 1 |
1 | 1 | 1 |
“对一个
与门
进行非操作,可以得到或门
”
这个其实是我对与门
的关系表观察得到的,因为与门
与或门
之间貌似是一个互补关系,或门
为1的情况出现了三次,与门
出现了一次,而且刚刚好与门
出现的1的情况就在角落里,想象一下要是我可以旋转一下1值出现的地方,在进行非操作,那么不就可以得出一个或门
了么。经过尝试,确实是可以的。演变的过程如下图
图图图图,后面补上
那么将这个过程转化为代码就是下面的样子
~(~x&~y)// | = ~(~x&~y)
然后再根据上面的分析,转化为代码
|&(~(x&y))
// 将|替换
(~(