超详解 CS:APP:Lab1-DataLab

本文详细介绍了CS:APP的DataLab实验,涵盖位操作练习如bitXor、tmin、tmax等,以及浮点数处理如floatScale2、floatFloat2Int和floatPower2。通过实际操作和逻辑分析,阐述了实验中的关键思路和技巧,包括如何利用位运算解决问题,并提到了在Linux环境下使用Docker进行实验的配置步骤。
摘要由CSDN通过智能技术生成

csapp-lab1-DataLab

写在前面

之前考研的时候csapp有刷过5,6遍但是一直没有做过实验,最近在学c++的时候准备重新刷一下大名鼎鼎的csapp实验。

0. 环境准备

最好准备一个纯净的Linux系统这里建议使用docker 构建一个centos或者 ubuntu系统

  1. 实验资料的下载

    CS:APP3e, Bryant and O’Hallaron

  2. docker上的环境搭建

  • 拉取centos系统

    docker pull centos

  • 建立目录挂载实现文件同步

    docker container run -it -v /Users/xxxx/yourFilePath:/csapp --name=csapp_env centos /bin/bash

  • 配置编译环境

    • 更新yum源

      yum -y update

    • 安装sudo

      yum install sudo

    • 安装c/c++编译环境

      yum install make automake gcc gcc-c++ kernel-devel

    • 安装gdb

      yum install gdb

    • 准备32位嵌入式c库

      yum install glibc-devel.i686

  1. 阅读readme 完成配置

    这里需要先进入刚才映射的文件目录csapp文件然后参考readme文件

    To compile and run the btest program, type:
    
        unix> make btest
        unix> ./btest [optional cmd line args]
    

完成上面的操作之后我们的配置就算完成了。

接下来我们可以在本机的编译器编写我们的代码。然后在docer中的虚拟容器上编译和运行我们的代码。✅
在编译器中编写
在这里插入图片描述
在docker容器中编译和运行
在这里插入图片描述
蓝色箭头为编译。红色箭头为运行

注意:每次更改bits.c文件后都要重新编译btest。如果需要检查单个函数的正确性,可以使用-f标志:

$ ./btest -f bitXor

dlc程序可以检测我们有没有违规,如果运行没有输出则没有问题

$ ./dlc bits.c

注意每次关闭docker在下一次运行的时候需要先启动我们的centos。

  1. 先找到我们命名为csapp_env容器的容器id
    在这里插入图片描述
  2. 然后docker start 容器ID启动我们的容器
  3. 输入以下命令进入到这个运行中的容器
    docker exec -it 容器id /bin/bash

1. 实验开始

*   IMPORTANT. TO AVOID GRADING SURPRISES:
*   1. Use the dlc compiler to check that your solutions conform
*      to the coding rules.
*   2. Use the BDD checker to formally verify that your solutions produce 
*      the correct answers.
*/
1.1 bitXor
a^b=
1.(a|b)&(~a|~b)
2.~(~a&~b)&~(a&b)
3.(a&~b)|(~a&b)

可以用这三种方式表示异或操作,具体的推导可以自行Google,参考离散数学我自己推了一下发现其实不难

主要是对德摩根律的应用

在这里插入图片描述

我们选择第二种操作即可过掉本例

int bitXor(int x, int y) {
  return ~(~x&~y)&~(x&y);
}
1.2 tmin
int tmin(void) {

  return 1<<31;

}
1.3 tmax

题目描述

* isTmax - returns 1 if x is the maximum, two's complement number,
*     and 0 otherwise 
*   Legal ops: ! ~ & ^ | +
*   Max ops: 10
*   Rating: 1
*/

思路

我们考虑四位的最大值x=0111 然后x+1之后就会变成1000 我们对1000 取非 0111 就会重新变回x值

这里要是可以用等于是不是直接完成了,但是不能用等于,在这可以用一个位运算的小技巧,我们知道自己与自己异或会得到0,也就是说我们可以用异或来判断等于!((~(x+1)^x)) 判断这个是否为1即可判断是否为最大值

这里有一个例外就是x=-1 由于-1=1111 他利用上面的式子判断也符合,故要特判-1 利用!!(x+1) 这个操作-1和最大值并不相同

int isTmax(int x) {

  return !((~(x+1)^x))&!!(x+1);
}
  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值