2024Spring> HNU-计算机系统-实验2-datalab-导引+验收

本文介绍了在Datalab实验中,通过完成bits.c中的函数,学习和深化理解位运算和IEEE浮点数存储机制的过程,包括实验工具包、完成流程、示例和期望,同时提及了运行时遇到的问题及其解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

datalab考验对于位运算以及浮点数存储的理解,如果真的肯花时间去搞懂,对计算机系统存储的理解真的能上一个台阶。与课程考试关联性上来说不是很大,但对于IEEE的浮点数表示一定要熟练掌握。

导引

①实验工具包

要完成的是bits.c中的15个函数。

打开README可以查看实验提供的工具包中各部分是干什么作用的,摘录如下。

  • bits.c- ★完成这个文件中的15个函数
  • bits.h- 头文件
  • btest.c- 主btest程序(用于测试结果)
  • btest.h,decl.c,tests.c,tests-header.c- 用于生成btest
  • fshow.c-用于检查浮点表示的实用工具
  • ishow.c-用于检查整数表示的实用工具
  • dlc -编译器

②实验完成流程

重复以下三个步骤直至完成15个函数并且结果都正确,实验结束。

  • 补全bits.c中的某一个函数
  • 【编译检验】使用./dlc bits.c 测试是否通过编译(即是否合法),若没有问题则没有返回
  • 【结果检验】使用make clean && make btest && ./btest 测试结果是否正确,会输出错误信息和正确信息

注:每次改动bits.c后均需重新make clean && make btest,这里的&& 可以直接敲上去,命令行会默认逐个执行&&连接的语句,或者自行拆分逐个敲语句也可以。

【可选】使用./dlc -e bits.c打印每个函数使用的运算符数,操作数也需要满足限制。

【可选】小工具ishow和fshow,可以用来看一个数在int类型和float类型下有无符号形式的值。

    unix> ./ishow 0x27
    Hex = 0x00000027,	Signed = 39,	Unsigned = 39

    unix> ./ishow 27
    Hex = 0x0000001b,	Signed = 27,	Unsigned = 27

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

    linux> ./fshow 15213243
    Floating point value 2.131829405e-38
    Bit Representation 0x00e822bb, sign = 0, exponent = 0x01, fraction = 0x6822bb
    Normalized.  +1.8135598898 X 2^(-126)

最终可用./driver.pl来进行总体验证,得出最终分数。

③举例

1 bitAnd

/*
 * bitAnd - x&y using only ~ and |
 *   Example: bitAnd(6, 5) = 4
 *   Legal ops: ~ |
 *   Max ops: 8
 *   Rating: 1
 */

bits.c函数上方的注释中标注了完成该函数的要求以及函数功能描述。

这个函数要求使用按位或按位取反实现按位与,最多使用的符号数目是2个。

思路:使用德摩根定律将“按位与”操作转换为“按位取反”和“按位或”操作。

因此我们可以这样完成这个函数。

int bitAnd(int x, int y)
{
  return ~(~x | ~y);
}

注意:1-12依据各函数要求;13,14,15允许使用if,while等语句进行编写。

④期望

希望你能:

  • 独立完成实验,思路清晰
  • 进行经验总结,探究感悟
  • 熟练掌握IEEE浮点数表示
  • 真的从实验中收获知识与快乐

不要过于纠结于验收形式(验收分数差异真的不大)

⑤ 运行时BUG解决1-/usr/include/stdio.h:27:10: fatal error: bits/libc-header-start.h: No such file or directory

有同学在使用make btest时遇到问题如下

该问题产生的原因及解决方法如下:

即可正常运行。

⑥运行时BUG解决2-fitsBits一个测试过不了

顺便解决遇到这个问题

解决方法:

【注】若两个问题同时遇到,该行的-O和-m32都要关掉

该问题解决

【注】以上两个bug同时常出现于:环境发生迁移时,如虚拟机环境/docker环境/WSL子系统环境等。所以部分同学可能未遇到,部分同学遇到,这取决于你的环境。具体原因应该是架构上的问题,不去深究。

验收

总体思路:

说是实验验收,实际上主要确保同学能掌握两个点,一个是位运算,第二个是IEEE浮点数的表示。后者是主要的任务,必须确保每个同学掌握了,因为期末考试第一题往往就是这个知识点。

我的验收流程:

  • 从1-13的题目中挑选1-3个印象深刻的,讲讲是怎么做的。
  • 从14-15的题目中挑选1个,主要涉及到浮点数。必须确保掌握IEEE的基本知识。

【主要根据讲解思路,判断是否是自己完成的,比较热门的题目有isLessorEqual,bitcount,ilog2】

部分题目的主要问题:

isLessorEqual:

  • 为什么要先比较是否同号再进行相减?【防止数据过大导致溢出】

bitcount:

  • 简述思想
  • 给你一组数据,对这个数据按照你的算法进行实操。
  • 如果是用掩码的方法,这一步的掩码是什么。
  • 这是一种什么思想?分治/二分

ilog2:

  • 简述思想
  • 给你一组数据,对这个数据按照你的算法进行实操。
  • 这是一种什么思想?分治/二分

i2f:

  • IEEE的浮点数的符号位,阶码,尾数,是怎么来的
  • 向偶舍入是怎么处理的

float*2

  • 浮点数的类型都有哪几类:规格化数,非规格化数,无穷,NAN
  • 对于规格化数怎么处理,对于非规格化数怎么处理

验收总结

主要还是确保同学们都会相关知识点了,所以就没有深入问。基本能确保同学是自己做的,然后对我关注的知识点都了解了,我就停止继续问了。同学的表现都还是比较好的。

参考:

HNU-计算机系统-实验2-DataLab_hnu计算机系统-CSDN博客

WebSocket是一种在客户端和服务器之间建立持久连接的协议,它允许双方进行双向通信,极大地提高了实时性,被广泛应用于即时通讯、在线游戏、股票交易等领域。本篇将详细讲解如何使用C#来实现WebSocket,以及Fleck库在其中的作用。 WebSocket协议基于HTTP的握手过程,但一旦连接建立,它就不再依赖HTTP,而是通过TCP直接通信。在C#中,我们可以利用.NET Framework或.NET Core提供的System.Net.WebSockets命名空间来创建WebSocket服务器和客户端。然而,对于更高级的功能和更好的灵活性,开发者通常会选择第三方库,如Fleck。 Fleck是C#中一个轻量级且高效的WebSocket服务器实现。它提供了丰富的事件驱动API,使得开发者可以轻松地处理WebSocket连接的建立、消息传递和断开等操作。下面我们将探讨Fleck的使用步骤: 1. **安装Fleck**:你需要在你的项目中添加Fleck库。如果你使用的是NuGet包管理器,可以通过搜索"Fleck"并安装来获取。 2. **初始化服务器**:在C#代码中,首先创建一个Fleck服务器实例,指定监听的IP地址和端口号。例如: ```csharp var server = new Fleck.WebSocketServer("ws://localhost:8080"); ``` 3. **配置服务器**:你可以设置各种配置选项,如最大接收/发送缓冲区大小、心跳间隔等。然后注册事件处理器,如OnOpen、OnClose、OnMessage等,以处理客户端连接、断开和消息接收。 4. **连接事件**:`OnOpen`事件在客户端连接时触发,你可以在这里对新连接进行初始化操作,如存储连接信息、验证用户等。 5. **消息处理**:`OnMessage`
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值