【CSAPP】-datalab实验

实验原理与内容

本实验每位学生拿到一个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.mzph.cn/diannao/40875.shtml

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

相关文章

【全网最全】2024年APMCM第十四届亚太地区大学生数学建模竞赛(中文赛项)完整思路解析+代码+论文

我是Tina表姐&#xff0c;毕业于中国人民大学&#xff0c;对数学建模的热爱让我在这一领域深耕多年。我的建模思路已经帮助了百余位学习者和参赛者在数学建模的道路上取得了显著的进步和成就。现在&#xff0c;我将这份宝贵的经验和知识凝练成一份全面的解题思路与代码论文集合…

云计算【第一阶段(26)】Linux网络设置

一、查看网络配置 1.查看网络接口信息ifconfig 查看所有活动的网络接口信息 2.ifconfig命令 查看指定网络接口信息 ifconfig 网络接口 &#xff08;1&#xff09;第一行&#xff1a;以太网卡的名字 ens33其中en代表以太网卡&#xff0c; centos6的是eth0&#xff0c; e…

中国算力网络市场发展分析

中国算力网络市场发展现状 算力涵盖计算、内存、存储等全方位能力&#xff0c;广泛分布于网络边缘、云计算中心、联网设备及转发节点。随着数字化技术革新&#xff0c;算力与网络正深度融合&#xff0c;推动“算网一体化”的演进。这一新型基础设施日渐凸显其重要性&#xff0c…

精准畜牧业:多维传感监测及分析动物采食行为

全球畜牧业呈现出一个动态且复杂的挑战。近几十年来&#xff0c;它根据对动物产品需求的演变进行了适应&#xff0c;动物生产系统需要提高其效率和环境可持续性。在不同的畜牧系统中有效行动取决于科学技术的进步&#xff0c;这允许增加照顾动物健康和福祉的数量。精准畜牧业技…

Samtec汽车电子 | 汽车连接器如何在高要求、极端的环境中工作

【摘要/前言】 汽车电子&#xff0c;这些年来始终是极具流量的热门话题&#xff0c;目前不断发展的智能座驾、辅助驾驶等赛道都是对相关产业链需求的进一步刺激&#xff0c;这里蕴含着一片广阔的市场。 同样&#xff0c;广阔的市场里有着极高的准入门槛和事关安全的技术挑战。…

Windows安全认证机制——Windows常见协议

一.LLMNR协议 1.LLMNR简介 链路本地多播名称解析&#xff08;LLMNR&#xff09;是一个基于域名系统&#xff08;DNS&#xff09;数据包格式的协议&#xff0c;使用此协议可以解析局域网中本地链路上的主机名称。它可以很好地支持IPv4和IPv6&#xff0c;是仅次于DNS解析的名称…

代谢组数据分析(十三):评估影响代谢物的重要临床指标

欢迎大家关注全网生信学习者系列: WX公zhong号:生信学习者Xiao hong书:生信学习者知hu:生信学习者CDSN:生信学习者2介绍 相关性分析是通过计算两个变量之间的相关系数来评估它们之间线性关系的强度和方向。最常用的是皮尔逊相关系数(Pearson correlation coefficient),…

软件测试常见的面试题(46道)

01、您所熟悉的测试用例设计方法都有哪些&#xff1f;请分别以具体的例子来说明这些方法在测试用例设计工作中的应用。 答&#xff1a;有黑盒和白盒两种测试种类&#xff0c;黑盒有等价类划分法&#xff0c;边界分析法&#xff0c;因果图法和错误猜测法。白盒有逻辑覆盖法&…

VBA通过Range对象实现Excel的数据写入

前言 本节会介绍通过VBA中的Range对象&#xff0c;来实现Excel表格中的单元格写入、区域范围写入&#xff0c;当然也可以写入不同类型的数据&#xff0c;如数值、文本、公式&#xff0c;以及实现公式下拉自动填充的功能。 一、单元格输入数据 1.通过Value方法实现输入不同类型…

Windows上使用Navicat连接ubuntu上的mysql8报错:10061和1130

问题一&#xff1a;can’t connect to mysql server on ‘192.168.xxx.xxx’(10061) 解决&#xff1a; sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf&#xff0c;bind-address绑定了登陆的IP&#xff0c;把这两行代码注释掉&#xff0c;然后重启mysql。 问题二&#xff1a;1…

Swift 定制 Core Data 迁移

文章目录 前言什么是 Core Data 迁移&#xff1f;示例更新模型创建一个新的模型版本创建映射模型编写自定义迁移策略总结 前言 随着应用程序和用户群的增长&#xff0c;你需要添加新功能&#xff0c;删除其他功能&#xff0c;并改变应用程序的工作方式。这是软件开发生命周期的…

底层软件 | 十分详细,为了学习设备树,我写了5w字笔记!

0、设备树是什么&#xff1f;1、DTS 1.1 dts简介1.2 dts例子 2、DTC&#xff08;Device Tree Compiler&#xff09;3、DTB&#xff08;Device Tree Blob&#xff09;4、绑定&#xff08;Binding&#xff09;5、Bootloader compatible属性 7、 #address-cells和#size-cells属性8…

动态规划入门,从简单递归到记忆化搜索到动态规划

动态规划入门&#xff0c;从简单递归到记忆化搜索到动态规划 打家劫舍 class Solution {private int nums[];public int rob(int[] nums) {this.nums nums;return dfs(nums.length - 1);}public int dfs(int i){if (i < 0){return 0;}int res Math.max(dfs(i - 1), dfs(i…

预制菜工厂MES系统:具体功能与应用场景

在现代化食品工业中&#xff0c;预制菜&#xff08;Ready-to-Eat, RTE&#xff09;因其方便快捷、卫生安全及营养均衡的特点&#xff0c;迅速在餐饮行业中占据重要地位。为了进一步提升预制菜工厂的生产效率、保障产品质量并降低生产成本&#xff0c;制造执行系统&#xff08;M…

ffmpeg将多个yuv文件编码为MP4视频文件

一、编码方案 在视频录制时&#xff0c;每一帧保存为一个yuv文件&#xff0c;便于纠错和修改。在编码为MP4文件时&#xff0c;我的方案是将所有yuv文件先转码为单个MP4文件&#xff0c;然后使用ffmpeg的concat功能拼接为完整的视频。 二、shell脚本 #!/bin/bash# 检查参数数量…

MYSQL8.0环境部署

创建用户 groupadd mysql useradd -g mysql mysql 删除原来的包 # rpm -qa|grep mysql # rpm -qa|grep mari mariadb-libs-5.5.68-1.el7.x86_64 # rpm -e --nodeps mariadb-libs-5.5.68-1.el7.x86_64 解压 cd /usr/local & mkdir mysql cd mysql # cp mysql-8…

Ubuntu 22.04 安装中文字体

笔者在用OpenCV4.9处理图片加水印时&#xff0c;中文乱码。原来是Ubuntu 22.04发行版缺少中文字体支持&#xff0c;因此&#xff0c;笔者就找资料安装了需要的中文字体&#xff0c;特此记录&#xff0c;以备后查。 1、打开终端&#xff1a; 2、更新软件包列表&#xff1a; su…

水利行业的智慧化转型实践:结合具体案例,探讨智慧水利在提升水资源利用效率、改善水生态环境方面的实际效果

目录 一、引言 二、智慧水利的定义与意义 三、智慧水利在提升水资源利用效率方面的实践 1. 智慧灌溉系统 2. 智慧供水系统 3. 智慧水务管理平台 四、智慧水利在改善水生态环境方面的实践 1. 智慧水质监测系统 2. 智慧水生态修复系统 3. 智慧防洪减灾系统 五、具体案例…

如何在 Odoo 16 中添加计算字段的搜索过滤器

首先&#xff0c;了解 Odoo 使用计算字段的原因很重要。当我们需要从其他字段获取计算值或计算值时&#xff0c;就会使用计算字段。换句话说&#xff0c;不是从数据库中检索值&#xff0c;而是可以使用函数计算字段的值。计算字段的一个例子是产品总金额&#xff0c;即通过将产…

EtherCAT通讯介绍

一、EtherCAT简介 EtherCAT&#xff08;Ethernet for Control Automation Technology&#xff09;是一种实时以太网技术&#xff0c;是由德国公司Beckhoff Automation在2003年首次推出的。它是一种开放的工业以太网标准&#xff0c;被设计用于满足工业自动化应用中的高性能和低…