计算机系统实验-DataLab

news2024/11/28 20:52:59

一.实验题目及要求

在给定规则限制下完成bits.c中的函数。其中最主要的规则如下:

整数规则

  • 不能使用for while if等
  • 只能使用! ˜ & ˆ | + << >>运算符
  • 只能使用int
  • 只能使用0-0xFF的常数
  • 使用运算符数不超过限制(Max ops)
  • 不能使用全局变量或调用函数等其他规则

浮点数

  • 可以使用for while if
  • 只能使用int,unsigned int
  • 使用运算符数不超过限制(Max ops)
  • 不能使用数组,函数调用等其他规则

完成bits.c后使用./dlc检查代码是否符合规范,make btest进行编译,./btest进行函数测试。

二.实验过程

1.bitAnd

题目要求:

使用按位或和按位取反实现按位与

思路:

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

2.getByte

题目要求:

从低位起字节编号为0-3,取出编号为n的字节

思路:

将需要的字节右移到最低位,再和0xFF与清除其他位。右移的位数为n*8.

3.logicShift

题目要求:

实现逻辑右移。

思路:

算数右移与逻辑右移的区别在于符号位的补充,只要在算数右移n位后,将前n位清除就可以实现逻辑右移。因此需要得到前n位为0,后32-n位为1的数与算数右移后的x相与。采用了将0x80000000移位先得到前n位为1,后32-n位为0的数后取反的方式得到这个数,由于题目限制,0x80000000需要移位得到。(也可以将0x80000000先取反再右移n得到这个数)

4.bitCount

题目要求:

数出二进制数中1的个数。

思路:

最初的想法是移位和0x1与得到1的个数,但题目限制不允许使用循环语句,最终参考学习了正确的方法解决。错误的想法在于直接考虑1的个数是困难的,应该使用分治的思想解决。

将所有位每两位为1组,先计算每2位的1的个数,再计算4个位1的个数,8个位1的个数,16个位1的个数,最后得到32个位1的个数。计算个数的方式是和特殊的数相与(0x55555555,0x33333333,0x0F0F0F0F,0x00FF00FF,0000FFFF),每次计算的方式是相邻两组的值相加,且需要移位。需要的数按照规则不可以直接使用,需要先通过移位相加得到。

5.bang

题目要求:

实现取非操作。

思路:

等价于求二进制数中是否含有1。高16位与低16位相或,低8位与8-16位相或,低4位与4-8位相或,低2位与2-4位相或,最低位和第二位相或,最终得到的结果是32位相或的结果,也就是是否含1,即最终结果。这个思路与bitCount的分治思路类似。

另一种方法:

参考其他解法时发现更多使用的是另一种解法,利用0取反+1仍是0的特点区别0和其他数,有同样特点的另一个数是0x80000000,只要通过符号位就可以区分。这个特点是以0x80000000的负数仍是本身学习的,也是需要注意的特殊情况,做本题时没有意识到0也有这个特点。

6.tMin

题目要求:

最小的补码。

7.fitsBits

题目要求:

求x是否可用n位补码表示。

思路:

本题也是参考学习了正确的方法重新分析完成的。符合要求的数的特点是从低位起第n位到31位没有有意义的数值,对于正数体现为前33-n位为0,负数体现为前33-n位均为1。那么左移32-n位,再右移32-n位得到的数应该和原数相等,就可以得到答案。相等用异或取反判断。这道题的关键在于数的特点,正数的特点是明显的,负数的特点可以根据扩展进行理解,扩展补1,那么去掉补充的1结果也是不变的。

8.divPwr2

题目要求:

计算x除2的n次方。

思路:

右移n位,对负数进行偏移处理。

9.negate

题目要求:

求-x,取反+1即可。

10.isPositive

题目要求

大于0返回1.

思路:

判断符号位是否为0,为0返回1,特殊处理0x0的情况,可以进行两次取非处理。

 

11.isLessOrEqual

题目要求:

实现<=判断。

思路:

两数作差判断是否大于0,注意可能产生溢出,对于符号不同的情况可以直接判断。

12.ilog2

题目要求:

求以2为底的对数,向下取整。

思路:

求2为底的对数相当于找到最高位1的位置,但在找到最高位1的同时怎样将其转换为对应的权没有方向。参考了学习了两种方法解决这道题。

将最高位1右侧的位全部通过移位覆盖,再进行bitCount,最终的结果就是1的个数-1,利用了最高位1的特点。

另一种解法:

先通过右移两次取反检测高16位是否有1,如果有则结果至少为16,继续检测高8位,如果没有则检测8-16位是否有1,接下来根据检测结果检测一个长度为4的区间,依次类推,最终得到结果。每次的检测结果要乘上对应的权重,如高16位有1,结果+16,高8位有1,结果再+8。

13.floatNeg

题目要求:

浮点数取-x。

思路:

将符号位取反即可,NaN通过尾数和阶码判断,尾数不为0,阶码都为1则直接返回原值。

14.float_i2f

题目要求:

将整型转换为浮点数表示。

思路:

按照IEEE标准进行规格化处理,细节的部分比较多。

符号位可以直接使用原int型的符号位。

阶码部分,为了取得原值的2的最高次方,希望进行与ilog2类似的操作,因此先将负数取反+1变为整数,同时注意到0x80000000和0两个特殊值,直接判断排除这两种情况。求对数时由于可以使用while语句,采用移位的方式实现,设E=30,移位开始判断第31位是否为1,E—直到找到最高位的1。最终的到的E就是所求对数,加上偏移量127并移位到对应的位置,得到阶码部分。

尾数部分,首先要得到完整的尾数,完整的尾数是最高位1右侧的数加上补充的0。E+1是最高位1的位置,左移32-E-1+1=32-E就可以将最高位1移出,剩下完整的尾数。浮点数中尾数只有23位,因此需要右移9位,并清除补充的位。

舍入的处理主要是对被舍弃的9位和尾数最低位做判断,按照向偶舍入的规则进行判断即可。

15.float_twice

题目要求:

返回2f。

思路:

对于规格化数阶码+1即可,非规格化数由于可以和规格化数平滑衔接,只需要左移1位,补充符号位,特殊值直接返回原值。

结果测试

三.实验总结

通过实验熟悉了位的基本操作,更进一步熟悉了数的机器表达形式以及特点。熟悉了异或取反判等,移位和0x1与得符号位等基本的位操作,通过使用一些数的特性,算数右移左移操作特点进一步熟练了整数和浮点数在位级的表示与一些运算方法。

在开始动手时对移位的灵活操作不熟悉,对数的一些特点也不熟悉,遇到困难很难自己推导解决,但是熟悉了一些常见操作后就可以利用这些特性解决问题。在处理问题时也参考了许多网上的解法,用更易理解的方式重写以及补充必要的注释,以便复习。而在参考解法时也发现了一些题的多种解法,这体现了位处理的灵活性。在这些解法中,最难想到的是分治的解法,不知道怎样进行分治,并对分解的部分进行处理。bitCount学习了这种方法,但在ilog2中还是没有想到分解二进制数判断最高位的方法。除了方法方面,一些基本知识点也很重要,尤其体现在float_i2f这道题,只要按照IEEE进行处理就能完成,但具体到移出最高位1,处理偶数舍入,仍然会犯一些错误,需要注重细节。通过这道题也完完全全理解了整型是如何转换为浮点型的以及精确度的问题。

最后是完成题目的一些位处理技巧的总结:

  • 清除(保留)特定的位:使用特殊的数进行与运算(0xFF,0x1FF..)
  • 分治:将问题分解为16位,8位,4位..逐步处理(或自底向上处理)
  • 取反+1得到相反数
  • 0x0和0x80000000的相反数是本身
  • 异或取反判等
  • 两次取非判断0
  • 作差判断大小,考虑符号不同的溢出情况
  • 多次右移将最高位1右侧的位全部置1
  • 负数转为正数求E
  • 向偶舍入
  • 浮点数乘2:规格化阶码+1,非规格化左移1位

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

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

相关文章

将简单工厂模式改造应用到项目中,而不是纸上谈兵

10月26日晚补充&#xff1a;经过掘友的提醒&#xff0c;我才发现之前我这篇所写的策略模式&#xff0c;其本身更偏向于工厂模式&#xff0c;我起初以为是掘友分不清工厂模式和策略模式&#xff0c;实际上是我自己把自己绕进去&#xff0c;看不清工厂模式和策略模式的区别。 因…

网闸的工作原理

网闸GAP由固态读写开关和存储人质系统组成&#xff0c;其中固态开关的转换效率达到了纳秒级&#xff0c;存储介质通常采用scsi硬盘&#xff0c;因此GAP的性能得到了保证。 GAP连接在两个独立的网络系统中间&#xff0c;内网与外网永远不同时连接&#xff0c;在同一时刻只有一个…

鱼传科技:函数计算,只要用上就会觉得香

深圳鱼传科技有限公司是专注以精准营销和互联网生态产品运营为核心的综合互联网营销推广服务商。通过整合全网优质媒体资源&#xff0c;并结合智能数据模型和 AI 标签算法&#xff0c;向企业提供包括流量矩阵搭建运营、媒介流量采买、投放模型设计、产品营销策划、数据监控分析…

面试官:如何解决 Redis 数据倾斜、热点等问题

Redis 作为一门主流技术&#xff0c;应用场景非常多&#xff0c;很多大中小厂面试都列为重点考察内容 前几天有小伙伴学习时&#xff0c;遇到下面几个问题&#xff0c;来咨询小编 考虑到这些问题比较高频&#xff0c;工作中经常会遇到&#xff0c;这里写篇文章系统讲解下 问…

健身房头戴式耳机好吗、最优秀的健身房耳机推荐

作为一名运动爱好者&#xff0c;无论是在户外跑步、骑行&#xff0c;还是在室内健身&#xff0c;耳机都是平日运动时不可或缺的装备。即使在日常通勤中&#xff0c;很多人也不能缺少它的陪伴。普通的耳机很好选择&#xff0c;只需要看音质好不好就可&#xff0c;运动耳机就比较…

win10系统下安装JDK1.8及配置环境变量的方法

1&#xff1a;下载安装包 地址&#xff1a;https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html 选择与自己环境相匹配的安装包 后续过程需要登录Oracle账号&#xff0c;如果你网络环境不好或者没有Oracle账号&#xff0c;请按照文末默认获取方式获…

ssm+Vue计算机毕业设计校园闲置物品交易系统(程序+LW文档)

ssmVue计算机毕业设计校园闲置物品交易系统&#xff08;程序LW文档&#xff09; 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项…

GCSE英语语言考试-叙述视角

What is narrative voice? Narrative voice is the perspective the story is told from. The writer chooses a narrative voice carefully, as it can have an important effect on the story and the reader’s response. 什么是叙述视角&#xff1f; 叙述视角是讲述故事的…

机器人逆向运动学(IK)入门:问题分析

在游戏开发和机器人开发中进场需要用到的一个场景是&#xff0c;给机器人或者游戏角色末位置的位置和姿态&#xff0c;求解可到达给定位置和姿态的各关节的角度值&#xff0c;这里就需要逆向运动学去求解这个问题&#xff0c;在场景中有着很多的应用&#xff0c;比如说六轴机械…

电脑重装系统蓝屏详细解决方法分享

我们在使用电脑时我们经常会遇到各种问题&#xff0c;比如卡顿&#xff0c;死机&#xff0c;蓝屏&#xff0c;黑屏等等。今天这里小编为大家介绍的是电脑蓝屏的问题&#xff0c;电脑蓝屏会导致数据丢失、未保存的文件丢失、游戏关键时刻坑队友等情况。接下来&#xff0c;小编就…

使用Github Actions自动部署vue项目到nginx服务器

解决的问题&#xff1a;妈妈再也不担心我deploy时候手滑了 1. 避免手动执行重复的前端发布流程&#xff0c;节约开发时间和耐心 2. 减少了使用Jenkins类似的工具来做这种简单的发布流程&#xff0c;减少了第三方系统&#xff08;Jenkins&#xff09;的维护成本 前置条件 1.…

MySQL数据库学习(7)

一、简介 MySQL是最流行的关系型数据库管理系统&#xff0c;在这里我使用 PyMySQL 连接数据库&#xff0c;并实现简单的增删改查。 PyMySQL是在 Python3.x版本中用于连接 MySQL服务器的一个库&#xff0c;Python2中则使用 mysqldb。 PyMySQL遵循 Python数据库 API v2.0规范&…

保命小诀窍:IDEA远程Debug技巧,你了解吗?

前言 昨天看到一个问题&#xff0c;“疫情结束后你最想吃什么&#xff1f;” 仔细想了一下&#xff0c;火锅&#xff1f;烤肉&#xff1f; 看了一下体重秤&#xff0c;怕是只能报个健身房了。 你以为你胖N斤的时间复杂度是O(2^N)&#xff0c; 事实上它是O(1)&#xff0c;嗖…

MySQL——MySQL的flush

有时候会出现这么一种情况&#xff1a;一条 SQL 语句&#xff0c;正常执行的时候特别快&#xff0c;但是有时也不知道怎么回事&#xff0c;它就会变得特别慢&#xff0c;并且这样的场景很难复现&#xff0c;它不只随机&#xff0c;而且持续时间还很短。 SQL语句为何变慢了 根…

Oracle单机部署:数据库安装

Oracle单机部署&#xff1a;数据库安装安装前须知数据库字符集自动内存管理数据库安装配置图形化安装安装后检查&#x1f42c; 使用oracle用户来安装数据库。 安装前须知 数据库字符集 在创建数据库之后&#xff0c;更改字符集在时间和资源上的代价都是非常昂贵的。可能需要…

全球银行最大分布式核心系统全面上线,邮储银行做到了!

摘要&#xff1a;近年来&#xff0c;国家陆续出台金融科技相关政策&#xff0c;提出创新驱动发展战略&#xff0c;强调以新一代信息和网络技术为支撑&#xff0c;拓展互联网金融&#xff0c;促进技术创新和商业模式创新的融合。本文分享自华为云社区《全球银行最大分布式核心系…

算法设计 - 01背包问题

学习来源 【自制】01背包问题算法动画讲解_哔哩哔哩_bilibili 问题描述 有N件物品&#xff0c;第i件物品的重量是w[i]&#xff0c;价值是p[i]。 有一个背包&#xff0c;背包的承重是W。 求解&#xff1a;将哪些物品装入背包可获得最大价值。 实例说明 有如下物品&#xff…

尚医通-MyBatis-Plus:条件查询Wapper(五)

&#xff08;1&#xff09;MyBatis-Plus&#xff1a;条件查询 实现对数据库复杂的条件操作&#xff1a; Wrapper &#xff1a; 条件构造抽象类&#xff0c;最顶端父类 AbstractWrapper &#xff1a; 用于查询条件封装&#xff0c;生成 sql 的 where 条件 QueryWrapper &…

【文献研究】车辆路径问题静态合作博弈的数学模型及算法实现

前言&#xff1a;以2015年发表在期刊《MATHEMATICAL GAME THEORY AND APPLICATIONS》上的文章《Strong Coalitional Equilibrium in a Transportation Game》为学习资料&#xff0c;学习关于车辆路径模型的合作博弈。以下是本人对文献内容的一些粗浅理解&#xff0c;由于本人英…

linux批量操作文件命令总结

总结下常用的linux命令&#xff0c;linux下的命令组合着实强大。有时候即便是使用的windows系统也可以在Dos窗口下使用linux下的一些命令工具&#xff0c;完成一些文本日常处理。 查找所有文件 find ./ -name "*.log" 查找某一后缀的文件并删除 find ./ -name &qu…