【CSAPP】-datalab实验

news2024/11/17 12:22:00

实验原理与内容

本实验每位学生拿到一个datalab-handout.tar文件。学生可以通过U盘、网盘、虚拟机共享文件等方式将其导入到Unbuntu实验环境中,选择合适位置存放。然后在Ubuntu环境下解压。解压后,根据文件中的叙述和要求更改bits.c文件。本次实验的主要操作方式为:使用C语言的位操作符实现题目要求。

需要完成bits.c中下列函数功能,具体分为三大类:位操作、补码运算和浮点数操作。

1.位操作

表1列出了bits.c中一组操作和测试位组的函数。其中,“级别”栏指出各函数的难度等级(对应于该函数的实验分值),“功能”栏给出函数应实现的输出(即功能),“约束条件”栏指出你的函数实现必须满足的编码规则(具体请查看bits.c中相应函数注释),“最多操作符数量”指出你的函数实现中允许使用的操作符的最大数量。

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

表1 位操作题目列表

本题分数

函数名

功能

约束条件

最多操作符数

1

isZero

判断变量x是否为0。如果为0,则返回1;否则,返回0。

仅可以使用以下操作符: !  ~  &  ^  |  + <<  >>

2

1

specialBits

构建0xffca3fff,并返回。

仅可以使用以下操作符: !  ~  &  ^  |  + <<  >>

3

1

upperBits

根据输入的变量n,构建一个高n位为1其他位为0的数,并返回该值。

注:0<= n <=32

仅可以使用以下操作符: !  ~  &  ^  |  + <<  >>

10

1

bitMatch

构建一个比特序列(int型),构成规则如下:如果x和y在某一个bit位置的值相同,则此序列的相应位置为1,否则该位置值为0。

仅可以使用以下操作符: ~ &

14

1

bitOr

计算按比特或(x | y),并将计算结果返回。

仅可以使用以下操作符: ~ &

8

4

logicalNeg

使用位操作符实现逻辑非(!x)操作,并将取逻辑非之后的结果返回。

仅可以使用以下操作符: ~  &  ^  |  +  <<  >>

12

4

bitParity

如果x中包含奇数个0,则返回1;否则返回0。

仅可以使用以下操作符: !  ~  &  ^  |  +  <<  >>

20

2

byteSwap

将x的第n字节和第m字节交换,

0 <= n <= 3, 

0 <= m <= 3,

然后将交换后的值返回。

仅可以使用以下操作符: !  ~  &  ^  |  +  <<  >>

25

2

getByte

提取x的第n个字节。0 <= n <= 3 (0代表最最低为字节,3代表最高位字节),并将其返回。

仅可以使用以下操作符: !  ~  &  ^  |  +  <<  >>

6

2

oddBits

返回一个32bit数,这数的所有第奇数个bit位置的值为1。

仅可以使用以下操作符: !  ~  &  ^  |  +  <<  >>

8

3

replaceByte

将x的第n个字节用 c 进行替换,

0 <= n <= 3, 0 <= c <= 255

并将替换后的结果返回。

仅可以使用以下操作符: !  ~  &  ^  |  +  <<  >>

10

3

rotateLeft

将x向左循环移位n个bit。循环移位是指左边移除去的比特自动填充到右边空出的位置上。 0 <= n <= 31,并将循环移位后的值返回。

仅可以使用以下操作符: !  ~  &  ^  |  +  <<  >>

25

2.补码运算

表2列出了bits.c中一组使用整数的补码表示的函数。可参考bits.c中注释说明和tests.c中对应的测试函数了解其更多具体信息。

2 补码运算题目列表

本题分数

函数名

功能

约束条件

最多操作符数

2

negate

将输入参数x的值取相反数,返回-x。

仅可以使用以下操作符: !  ~  &  ^  |  +  <<  >>

5

4

absVal

计算变量x的绝对值,并将其绝对值返回。

仅可以使用以下操作符: !  ~  &  ^  |  +  <<  >>

10

3

isGreater

如果x > y,则返回1,否则返回0。

仅可以使用以下操作符: !  ~  &  ^  |  +  <<  >>

24

2

isNegative

如果x < 0,返回1;否则返回0。

仅可以使用以下操作符: !  ~  &  ^  |  +  <<  >>

6

4

isPower2

如果x是2的整数次幂,则返回1;否则返回0。

仅可以使用以下操作符: !  ~  &  ^  |  +  <<  >>

20

3

addOK

如果x+y没有溢出,则返回1;否则返回0。

仅可以使用以下操作符: !  ~  &  ^  |  +  <<  >>

20

3

subtractionOK

如果x-y没有溢出,则返回1;否则返回0。

仅可以使用以下操作符: !  ~  &  ^  |  +  <<  >>

20

3.浮点数操作

表3列出了bits.c中一组浮点数二进制表示的操作函数。可参考bits.c中注释说明和tests.c中对应的测试函数了解其更多具体信息。注意输入参数和返回结果均为unsigned int类型,但应作为单精度浮点数解释其32 bit二进制表示对应的值。

表3 浮点数操作题目列表

本题分数

函数名

功能

约束条件

最多操作符数

2

floatAbsVal

通过bit级操作返回一个float型浮点数的绝对值。如果输入参数为NaN,则直接返回输入参数的原值。

可以使用任何的操作符,包括||和&&。也可以使用if,while。

10

2

floatIsEqual

判断两个浮点数是否相等,如果相等则返回1,否则返回0。

如果输入参数中含有NaN,则返回0。

注:+0和-0被当作相等的情况对待。

可以使用任何的操作符,包括||和&&。也可以使用if,while。

25

实验过程与结果(可贴图)


安装gcc和ubuntu


isZero函数

isZero函数可能会接受一个数字作为输入,然后返回一个布尔值,该布尔值表示该数字是否为零。如果是零,函数返回True;如果不是零,函数返回False。

Negate函数

这个函数将接受一个数值作为输入,并返回其相反数。如果输入是正数1,则返回-1;如果输入是负数-1,则返回1;如果输入是零0,则返回0。

specialBits函数

这个函数目前学的还不是很懂,去一个地址再返回一个新的地址。


upperBits函数

这个函数检查函数为零的位,不为零跳到下一位,直到所有位为非零为止。
bitMatch函数


这个函数会返回一个x与y相等的位,用&操作符能恰好解决。

bitOr函数


这个函数会返回一个x与y相或的数,先对两个数进行取反,用&操作符最后用~操作符能恰好解决。

AbsVal函数

absval 函数用于计算一个数的绝对值。它接受一个数值作为输入,并返回该数值的绝对值。
我们可以先对数值进行左移再取反,最后结合异或操作符,能使函数达到这个功能。


logicalNeg函数

这个函数实现了如果x为0,则结果为0;如果x不为0,则结果为-1的补码表示。
将上一步的结果+1,得到0或1,就可以实现逻辑非操作。


bitParity函数

这个函数巧妙运用左移和右移操作符。

Byteswap函数


这个函数可以实现字节转换,我们可以巧妙运用左移和右移操作符,从而实现这个功能。

Getbyte函数


这个函数主要是要知道有效字节的位置,我们用右移操作符和左移操作符寻到最低位置,在用&0xff找到有效位的8位,就是要找的字节。


Isgreater函数


这个函数可以使得返回一个较大的值,类似max。


Isnegative函数


这个函数可以实现判断输入整数是否为负数的的操作,负数返回1,其它返回0。
巧妙运用右移操作符和取反,可以达到此效果。


Ispower2函数


这个函数实现判断x是不是为2的幂的操作。

Addok函数

这个函数可以实现两个数相加的值,判断这个值是不是溢出的操作,巧妙运用非操作符可以实现此功能。


Subtractionok函数

这个函数可以发现两个数的差,有没有造成溢出的操作,巧妙运用非操作符可以实现此功能。


Oddbits函数


这个函数可以使用位移和按位或运算符来构建出结果,从而返回所有奇数位设置为1的操作


Replacebyte函数

这个函数可以计算出需要进行位移的位数,然后分别创建一个用于清除和设置的掩码。最后,我们使用这些掩码对x进行操作,从而实现了替换字节的操作。


Rotateleft函数

这个函数可以使用位操作符 << 来实现左旋转操作。

Floatabsval函数

这个函数可以检查绝对值是否大于单精度浮点数表示的最大值,是,说明是NaN,直接返回原始值;不是返回绝对值。就可以实现返回浮点数绝对值的操作。

实验总结

在实验过程中,我们首先学习了整数和浮点数的二进制编码表示,了解了如何将十进制数转换为二进制数以及如何在计算机中存储和表示整数和浮点数。我们还学习了如何使用位操作来对二进制数进行操作,例如按位与、按位或、按位异或等。这些操作在计算机底层原理中非常重要,因为它们可以让我们更深入地理解计算机如何处理数据。我们通过实现一组给定功能的函数来加深对数据二进制编码表示的了解。这些函数包括加减乘除、位移运算、位操作等。在实现这些函数的过程中,我们不仅学会了如何使用位操作和算术运算来处理数据,还了解了不同类型的数据如何进行比较和运算。通过这次实验,我们不仅掌握了计算机中整数和浮点数的二进制编码表示,还学会了如何使用有限类型和数量的运算操作来实现一组给定功能的函数。这些知识和技能对我们今后的学习和工作都具有重要意义,因为它们可以帮助我们更好地理解计算机底层原理、编程和算法设计。


csapp的第一个实验,函数确实多一点,但是对于学习一些计算机系统的知识还是很有帮助的,希望这篇文章对你有所帮助,加油!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1882868.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

奇瑞员工控诉强制加班,加班费最多10元;高德数据被不正当抓取,一审判赔1250万元;知乎入局AI搜索;苹果手机出货量激增

一、商业圈 1.奇瑞员工控诉非法加班&#xff1a;加班费最多10元 根据脉脉平台热搜&#xff0c;近期&#xff0c;有多位网友曝奇瑞上海属地员工发起多项投诉&#xff0c;控诉奇瑞非法加班。据悉&#xff0c;奇瑞汽车正在积极准备上市中&#xff0c;若此事未得到妥善解决&#xf…

【React】上传文章封面基础实现

<Form.Item label"封面"><Form.Item name"type"><Radio.Group onChange{onTypeChange}><Radio value{1}>单图</Radio><Radio value{3}>三图</Radio><Radio value{0}>无图</Radio></Radio.Group&…

用好华为小助手,生活总能快人一步

嘿&#xff01;朋友们&#xff01;你们有没有想过&#xff0c;如果身边有一个小助手&#xff0c;他不仅聪明伶俐&#xff0c;还能在生活的方方面面给予你最贴心的关怀和帮助&#xff0c;让我们的日常生活变得更加方便和快捷&#xff0c;那该有多好&#xff01;没错&#xff0c;…

openEuler AArch64 架构 vCPU 热插拔技术内幕

OpenAtom openEuler&#xff08;简称"openEuler"&#xff09;社区引领技术浪潮&#xff0c;早在openEuler 20.09 创新版本就率先使能并对外开放了 AArch64 架构 vCPU 热插特性。时隔四年&#xff0c;openEuler 24.03 LTS 版本补充了 vCPU 热拔能力&#xff0c;vCPU 热…

MySQL学习(6):SQL语句之数据控制语言:DCL

DCL用来管理数据库用户&#xff0c;控制数据库的访问权限 1.管理用户 1.1查询用户 use mysql; select * from user; #用户信息都存放在系统数据库mysql的user表中 在user表中&#xff0c;一个用户是由用户名和主机名共同决定的&#xff0c;上图中的host一栏就是用户的主机名…

Stable Diffusion用AI绘画古诗文视频副业项目,轻松涨粉10W+,项目拆解分享给你【附详细玩法教程】

项目介绍 古诗文自古以来就有着广泛的受众&#xff0c;特别是在短视频平台上&#xff0c;它不仅有很高的流量潜力&#xff0c;还能给观众带来美的享受和教育意义。通过使用AI绘画工具&#xff0c;创作者能够将古诗文中的场景生动地呈现出来&#xff0c;制作出有艺术性、有教育…

【源码+文档+调试讲解】居家养老系统

摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了居家养老系统的开发全过程。通过分析高校学生综合素质评价管理方面的不足&#xff0c;创建了一个计算机管理居家养老系统的方案。文章介绍了居家养老系统的系统分…

操作系统真象还原:进一步完善内核

第12章-进一步完善内核 12.1 Linux系统调用浅析 系统调用就是让用户进程申请操作系统的帮助&#xff0c;让操作系统帮其完成某项工作&#xff0c;也就是相当于用户进程调用了操作系统的功能&#xff0c;因此“系统调用”准确地来说应该被称为“操作系统功能调用”。 Linux 系…

用Vue3和Plotly.js打造交互式3D图

本文由ScriptEcho平台提供技术支持 项目地址&#xff1a;传送门 基于 Plotly.js 的动态图表交互&#xff1a;颜色和可见性控制 应用场景介绍 本代码旨在为数据可视化提供一个交互式图表&#xff0c;允许用户动态控制图表中线条的颜色和可见性。此功能对于探索大型数据集或突…

网络安全 文件上传漏洞-18 第十八关 Pass-18

点击进入第十八关&#xff0c;并选择显示代码&#xff1a; //index.php $is_upload false; $msg null; if (isset($_POST[submit])) {require_once("./myupload.php");$imgFileName time();$u new MyUpload($_FILES[upload_file][name], $_FILES[upload_file][tmp…

网络爬虫(一)

1. 深度优先爬虫&#xff1a;深度优先爬虫是一种以深度为优先的爬虫算法。它从一个起始点开始&#xff0c;先访问一个链接&#xff0c;然后再访问该链接下的链接&#xff0c;一直深入地访问直到无法再继续深入为止。然后回溯到上一个链接&#xff0c;再继续深入访问下一个未被访…

SAP 替代关系完全替代简介

最近用户在对长周期物料进行备料的时候又提出替代料的问题,主料库存不足的时候需要考虑替代料的在途库存,经常会忘了SAP标准的替代料逻辑,这次一次性把这个逻辑写清楚。 关于替代料的逻辑在前面的博文中测试多个替代料的使用场景 1、后继物料 2、组合替代 本文主要测试一下…

时序(流式)图谱数据仓库AbutionGraph功能介绍-Streaming Graph OLAM Database

AbutionGraph是一款端到端的流式数据实时分析的图谱数据库&#xff0c;实时&#xff08;流式写入实时、高QPS决策分析实时、流式预处理实时&#xff09;表现在&#xff1a; 构建实时查询QPS响应时长与历史数据量无关的图模型&#xff1b;接入流式数据并实时更新图计算指标&…

软考《信息系统运行管理员》-2.1信息系统运维的管理

2.1信息系统运维的管理 信息系统运维管理体系框架 信息系统运维管理主要流程的目标 标准化&#xff1a;通过流程框架&#xff0c;构件标准的运维流程流程化&#xff1a;将大部分运维工作流程化&#xff0c;确保工作可重复&#xff0c;并且这些工作都有质量的完成&#xff0c;…

设置Docker中时区不生效的问题

项目中使用docker-compose&#xff0c;并通过以下方式设置了时区 environment:- SET_CONTAINER_TIMEZONEtrue- CONTAINER_TIMEZONEAsia/Shanghai 但是并没有正确生效&#xff0c;网上有很多博客都在推荐这个做法&#xff0c;另外一种是使用标准环境标量 -TZAsia/Shangehai …

ARP 原理详解 二

只要确定了 IP 地址后&#xff0c;就能够向这个 IP 地址所在的主机发送数据报&#xff0c;这是我们所熟知的事情。 但是再往深了想&#xff0c;IP 地址只是标识网络层的地址&#xff0c;那么在网络层下方数据链路层是不是也有一个地址能够告诉对方主机自己的地址呢&#xff1f…

SAP实现特别总账的凭证预制

SAP实现特别总账的凭证预制 仔细理解只有”其他”的特殊总帐标识才可预制凭证这句话. F-29/f-48不可预制。F-29/f-48预制时出现错误消息号 FP 030&#xff0c;提示特殊总帐标志类型“汇票和”预付定金“的特别总帐标志的过帐代码不能预制&#xff0c;这是系统写死的&#xff…

[vue2/vue3] 详细剖析watch、computed、watchEffect的区别,原理解读

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;我是前端菜鸟的自我修养&#xff01;今天给大家分享【深入剖析watch、computed、watchEffect的区别】&#xff0c;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;原创不易&#xff0c;如果能帮助到带大家…

云卓SKYDROID-H30——科技改变未来

云卓H30采用高通处理器、搭载安卓嵌入式系统&#xff0c;拥有三个工作频率&#xff0c;让图像更清晰、延迟更低、距离远、抗干扰性强&#xff0c;支持多种接口&#xff0c;更有10.1寸高清工业级阳光可视屏&#xff0c;防尘耐磨&#xff0c;结构强度高&#xff0c;适用于各种严苛…

python自动化之schedule

目录 代码&#xff08;以每5秒1次为例&#xff09;: 每5分钟1次 每2小时1次 每天18:00执行 用到的库&#xff1a;schedule&#xff0c;time 实现的效果&#xff1a;按秒来运行任务&#xff0c;按分钟来运行任务&#xff0c;按小时来运行任务&#xff0c;按天来运行任务 代…