CSAPP实验

2023-10-30

  • 实验目的:
    1更好地熟悉和掌握计算机中整数和浮点数的二进制编码表示。  
    2.实验中使用有限类型和数量的运算操作实现一组给定功能的函数,在此过程中加深对数据二进制编码表示的了解
    3. 熟悉linux基本操作命令,其中常用工具和程序开发环境
    4.完善bits.c的各个函数,实现其功能,并通过.btest的测试
  • 实验要求
    1. 尽快熟悉linux基本操作命令,还有其中常用工具和程序开发环境
    2. 除浮点数函数实现外,只能使用顺序程序结构,禁用if, do, while, for, switch等。
      有限操作类型,! ~  &  ^  |  +  <<  >>  各函数不一样
      禁用(!=、==、&&、|| 等组合操作符)
      常量值范围   0~255
      禁用强制类型转换
      禁用整型外的任何其它数据类型
      禁用定义和宏
      不得使用函数
      具体要求可参看bits.c各函数框架的注释
      可以使用循环和条件控制;
      可以使用整型和无符号整型常量及变量(取值不受[0,255]限制);
      不使用任何浮点数据类型、操作及常量。
      可以使用int和unsigned两种整型数据
      禁用浮点数据类型、struct、union或数组结构。
      浮点数函数均使用unsigned型数据表示浮点数据。
      float_abs等函数必须能处理全范围的变量值,包括(NaN)和infinity。
  • 实验内容及分析
1.题目要求:将32位数的末尾变为0

int pow2plus1(int x)

{

return (1 << x) + 1;//先向右移动一位,再向右移动一位,右移后首位不会对结果影响,再左移则末尾自动补0

}

2. 题目要求:第N(0-3)个字节0变为1,1变为0

int byteNot(int x, int n)

{

    int temp=0xFF;

    temp=temp<<(n<<3); //此时不清楚到底要对哪个字节进行处理,所以用0xFF(前面全为零),然后对其进行移位,使其全为一的字节对准要处理的字节;n代表的是字节,故移位时要乘8.

    return x^temp;//异或运算,与0异或等于本身,与1异或取反。

}



3. 题目要求:比较第n个字节是否相等

int byteXor(int x, int y, int n)

{

    int temp=0xFF;//比较第n个字节是否相等,就是把其他位置零,只留这一个字节,处理方法同上一题。

    temp=temp<<(n<<3);

    x=x&temp;

    y=y&temp;//把其他位置零,只留这一个字节

    return !!(x^y);//x,y若相同,则进行异或运算后所有位全为0,若不等,则存在1,结果大于零。对结果进行两次逻辑非(逻辑非:若为0则结果为1,若不为0,结果为1),正好得到符合题目要求的返回值。

}



4. 题目要求:实现逻辑与

int logicalAnd(int x, int y)

{

    return (!!x)&(!!y);//对每个数进行两次逻辑非,两个数就变成0或1,前面31位均为0,这时按位与运算对于最后一位数操作,得出的结果即为逻辑与的值。

}



5. 题目要求:实现逻辑或

int logicalOr(int x, int y)

{

  return (!!x)|(!!y);//同上

}



6. 题目要求:将32位数中的前n为移动至末位

int rotateLeft(int x, int n) {

    int a=x<<n;//把除前n位外所有数向前移动n位,相当于低(32-n)位,放到高位,低n位为0。

    int b=x>>(32-n);//高n位移动到低n位

    int c=~((~0)<<n);//0先取反,即为32个1,向右移动n位,再取反,即为低n位为1,前面全是0,用于把b前(32-n)位置零

    b=c&b; //这三步是:取出高n位,放到低n位,其余位为0

    return a|b;//a和b合并

}



7. 题目要求:32位数中含有奇数个1返回1,含有偶数个1则返回0

int parityCheck(int x)

{

   x=x^(x>>16);

   x=x^(x>>8);

   x=x^(x>>4);

   x=x^(x>>2);

   x=x^(x>>1);

   return x & 0x1;

}//异或运算相当于不进位的加法,现对其分为等长的两部分,再进行异或运算,对应的位置,如果是两个1,结果为0,1个1,结果为1;再重复此过程,直至最后移动1位。若为偶数个1,在这个过程中,1会两两结合,变为0;奇数个会最后剩下一个1在最低位,与0x1按位与,结果只剩最低位,即为所需结果。



8. 题目要求:2*x后是否溢出

int mul2OK(int x)

{

    int s1=(x>>31)&0x1;//取x符号位

    int s2=((x<<1)>>31)&0x1;//取结果的符号位

    return !!!(s1^s2);//若符号位不同则溢出

}



9. 题目要求:返回x*3/2后的结果

int mult3div2(int x)

{

  int a=x;

   a=(a<<1)+a;//乘以三

  int sign=(a>>31)&0x1;// 取出符号位

  int low=a&0x1; //取出最低位

  a=a>>1;//除以二

  a=a+(sign & low);//默认的舍入方式为向左舍入,这对于正数来说是满足题目的向零舍入的要求,但负数不满足。但如果负数为偶数,即最低位为0,结果为整数,没有舍入,不需处理;为负奇数,则需要加一(原来是向左,现加一实现向零舍入)。即只有负奇数要处理,而其符号位和最低位均是1,做按位与得1,加到结果中。

  return a;

}



10. 题目要求:x-y是否溢出

int subOK(int x, int y) {

   int result=x+(~y+1);//减去一个数就是加上其补码,补码的求法为取反加一

   int a=x^y;//判断两个运算的数是否同号

   int b=x^result;//判断结果与被减数是否同号

   int c=!((a&b)>>31);//取符号位再取非即为结果

  return c;

}//减法判断是否溢出,原理:负数减负数,正数减正数均不可能溢出。只有负数减去正数结果为正,和正数减负数结果为负才溢出。即两个运算的数不同号,结果与被减数不同号,才溢出。



11. 题目要求:取x的绝对值

int absVal(int x)

{

   int sign=(x>>31)&0x1; //取符号位

   int judge=sign+(~0);//符号位加上全1,即正数的时候为全1,负数时候为全0

   x=(x&judge)|(~judge&(~x+1));//用judge的值是否为0实现(x>0) ? x : -x

    return x;

}



12. 题目要求:当参数为NaN时,返回参数

unsigned float_abs(unsigned uf)

{

   unsigned result=uf & 0x7FFFFFFF;

   if(result>0x7F800000)

      return uf;

   else

      return result;

}//先将uf化为无符号数result,判断result是否为NaN(NaN表示的数阶码全为1,且尾数为非0),如果是返回uf,否则返回result



13. 题目要求:返回表达式(int)f的位级等效值(将float转换为int),任何超出范围的内容(包括NaN和infinity)都应返回0x80000000

int float_f2i(unsigned uf) {

  unsigned a;

  unsigned b;

  unsigned c;

  a=(uf>>31)&0x1; //提取符号位

  b=(uf>>23)&0x000000ff; //提取阶码

  c=uf&0x007ffff+0x00800000; //提取尾数,在第24位加1,因为IEEE754标准尾数默认省略1

  if(((uf&0x7fffffff)>0x7ff00000)||(b>158)) //NaN或者小数点右移溢出,b减去127之后,大于31,而int最多31位,超过其表示范围

  {

     return 0x80000000;

  }

  if(b<127)//阶码小于0,即为小数,int不能表示小数,返回0

  {

     return 0;

  }

  if(a==1)//负数

  {

     if((b-127)>23)//需要向左移位

     {

        c=~(c<<(b-150))+1;//补码

        return c;

      }

      else if((b-127)<23) //需要向右移位

      {

         c=~(c>>(150-b))+1;

         return c;

      }

  }

  if(a==0)//正数,其余同上

 {

   if((b-127)>23)

     {

        c=c<<(b-150);

        return c;

      }

      else if((b-127)<23)

      {

         c=c>>(150-b);

         return c;

      }

 }

}
  • 实验结果

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CSAPP实验 的相关文章

  • 如何从字符串中提取子字符串直到遇到第二个空格?

    我有一个像这样的字符串 o1 1232 5467 1232 5467 1232 5467 1232 5467 1232 5467 1232 5467 如何仅提取 o1 1232 5467 要提取的字符数并不总是相同 因此 我只想提取直到遇到
  • C# SmtpClient编程中如何设置带有中文的附件文件名?

    我的代码如下 ContentType ct new ContentType ct MediaType MediaTypeNames Application Octet ct Name 这是一个很长的中文文件名希望能用它在附件名中 Doc A
  • C#.Net 邮件将进入垃圾邮件文件夹

    我正在从 ASP net Web 应用程序发送电子邮件 邮件发送成功 没有失败 但大多数都进入了垃圾邮件文件夹 请帮助我克服垃圾邮件过滤器 我的发送邮件代码 public void SendMail string FromAddress s
  • 关于逻辑/算法的想法以及如何防止线程写入 Sql Server 中的竞争

    我有以下逻辑 public void InQueueTable DataTable Table int incomingRows Table Rows Count if incomingRows gt RowsThreshold async
  • C# 中的 Stack<> 实现

    我最近一直在实现递归目录搜索实现 并且使用堆栈来跟踪路径元素 当我使用 string Join 连接路径元素时 我发现它们被颠倒了 当我调试该方法时 我查看了堆栈 发现堆栈内部数组中的元素本身是相反的 即最近 Push 的元素位于内部数组的
  • strlen() 编译时优化

    前几天我发现你可以找到编译时strlen使用这样的东西 template
  • Boost ASIO 串行写入十六进制值

    我正在使用 ubuntu 通过串行端口与设备进行通信 所有消息都必须是十六进制值 我已经在 Windows 环境中使用白蚁测试了通信设置 并得到了我期望的响应 但在使用 Boost asio 时我无法得到任何响应 以下是我设置串口的方法 b
  • 在 Mono 中反序列化 JSON 数据

    使用 Monodroid 时 是否有一种简单的方法可以将简单的 JSON 字符串反序列化为 NET 对象 System Json 只提供序列化 不提供反序列化 我尝试过的各种第三方库都会导致 Mono Monodroid 出现问题 谢谢 f
  • 混合模型优先和代码优先

    我们使用模型优先方法创建了一个 Web 应用程序 一名新开发人员进入该项目 并使用代码优先方法 使用数据库文件 创建了一个新的自定义模型 这 这是代码第一个数据库上下文 namespace WVITDB DAL public class D
  • 用于在标头更改时重新编译的简单 C 项目的示例 makefile

    有谁有完整的 makefile 可以执行以下操作 如果 HEADER 文件发生更改 则重建项目 cpp 文件在 makefile 中列出 头文件未在 makefile 中列出 头文件允许与 cpp 文件具有不同的名称 部分cpp文件没有头文
  • C# 根据当前日期传递日期时间值

    我正在尝试根据 sql server 中的两个日期获取记录 Select from table where CreatedDate between StartDate and EndDate我通过了5 12 2010 and 5 12 20
  • OpenGL:如何检查用户是否支持glGenBuffers()?

    我检查了文档 它说 OpenGL 版本必须至少为 1 5 才能制作glGenBuffers 工作 用户使用的是1 5版本但是函数调用会导致崩溃 这是文档中的错误 还是用户的驱动程序问题 我正在用这个glGenBuffers 对于VBO 我如
  • Unity手游触摸动作不扎实

    我的代码中有一种 错误 我只是找不到它发生的原因以及如何修复它 我是统一的初学者 甚至是统一的手机游戏的初学者 我使用触摸让玩家从一侧移动到另一侧 但问题是我希望玩家在手指从一侧滑动到另一侧时能够平滑移动 但我的代码还会将玩家移动到您点击的
  • 来自嵌入图像的 BitmapSource

    我的目标是在 WPF 窗口上重写 OnRender 方法中绘制图像 someImage png 它是嵌入资源 protected override void OnRender System Windows Media DrawingCont
  • 如何防止 Blazor NavLink 组件的默认导航

    从 Blazor 3 1 Preview 2 开始 应该可以防止默认导航行为 https devblogs microsoft com aspnet asp net core updates in net core 3 1 preview
  • 在 azure blob 存储中就地创建 zip 文件

    我将文件存储在 Blob 存储帐户内的一个容器中 我需要在第二个容器中创建一个 zip 文件 其中包含第一个容器中的文件 我有一个使用辅助角色和 DotNetZip 工作的解决方案 但由于 zip 文件的大小最终可能达到 1GB 我担心在进
  • 如何从 Boost.PropertyTree 复制子树

    我有一些boost property tree ptree 我需要树来删除一些具有特定标签名称的元素 例如 xml 表示源ptree如下
  • 以编程方式创建 Blob 存储容器

    我有一个要求 即在创建公司时 在我的 storageaccount 中创建关联的 blob 存储容器 并将容器名称设置为传入的字符串变量 我已尝试以下操作 public void AddCompanyStorage string subDo
  • Xamarin Forms Binding - 访问父属性

    我无法访问页面的 ViewModel 属性以便将其绑定到 IsVisible 属性 如果我不设置 BindingContext 我只能绑定它 有没有办法可以在设置 BindingContext 的同时访问页面的 viewmodel root
  • 如何高效计算连续数的数字积?

    我正在尝试计算数字序列中每个数字的数字乘积 例如 21 22 23 98 99 将会 2 4 6 72 81 为了降低复杂性 我只会考虑 连续的数字 http simple wikipedia org wiki Consecutive in

随机推荐

  • Leetcode 刷题笔记(五) —— 链表篇之链表的基础操作和经典题目

    文章目录 系列文章目录 1 链表基本操作 707 设计链表 2 双指针迭代法 203 移除链表元素 206 反转链表 24 两两交换链表中的节点 3 双指针之快慢指针 19 删除链表的倒数第 N 个结点 160 相交链表 141 环形链表
  • Spring Boot CLI安装及快速入门示例

    Spring Boot CLI安装 Spring Boot是一个命令行工具 用于使用Spring进行快速原型搭建 它允许你运行Groovy脚本 这意味着你可以使用类Java的语法 并且没有那么多的模板代码 你没有必要为了使用Spring B
  • jpa|springboot|informix自定义SQL,条件判断

    jpa连mysql没什么说的 但是jpa连informix真的坑到家了 各种函数不支持 需求 在自定义sql的时候 需要判断参数是否为空 如果参数为空则不参与sql条件判断 就这么简单的一个需求 如果是jpa连mysql 那就用几个if判断
  • This application has no explicit mapping for /error, so you are seeing this as a fallback.

    Whitelabel Error Page This application has no explicit mapping for error so you are seeing this as a fallback Mon Nov 23
  • 矩阵打印(python实现)

    之前面试嵌入式软件的一道题 用c实现矩阵打印 考场上并没有写出来 之后总感觉自己写不出来也就没有去实现 在网上找也没能找到答案 结果这问题一直悬在脑海里 这才静下来想了想 发现并不难 便打算用python来实现 同时也是学习python之路
  • 基于PyTorch机器学习与深度学习实践应用与案例分析

    近年来 随着AlphaGo 无人驾驶汽车 医学影像智慧辅助诊疗 ImageNet竞赛等热点事件的发生 人工智能迎来了新一轮的发展浪潮 尤其是深度学习技术 在许多行业都取得了颠覆性的成果 另外 近年来 Pytorch深度学习框架受到越来越多科
  • azure 测试服务器性能,测试 Azure VM 网络吞吐量

    您现在访问的是微软AZURE全球版技术文档网站 若需要访问由世纪互联运营的MICROSOFT AZURE中国区技术文档网站 请访问 https docs azure cn 带宽 吞吐量测试 NTTTCP 10 06 2020 本文内容 在
  • Python实现动态绘制爱心

    效果 源码 https download csdn net download x q x 87246985
  • 各种系统架构图及其简介

    各种系统架构图及其简介 转载请保留出处 不胜人生一场醉汇总 以下文字和架构图均在本人相关系统设计和架构方案中有所应用 原文出处 http space itpub net 6517 viewspace 609654 1 Spring架构图 S
  • QTextCodec中的setCodecForTr等终于消失了 (Qt5)

    在Qt4中 国内很多新手都喜欢 不分青红皂白地使用如下3行代码 QTextCodec setCodecForTr QTextCodec setCodecForCStrings QTextCodec setCodecForLocale 尽管之
  • linux修改host文件

    host文件位置 etc hosts vi etc hosts即可编辑 修改方式类似windows
  • 80X86微处理器堆栈指令

    压栈 弹栈指令 压栈 PUSH OP1 出栈 POP OP1 OP1可以是16位或32位的寄存器或存储器 压栈 弹栈数据存储过程 如SP 1000H BP 0FFFFH 执行下列指令后 DX SP STC Set CF 1 PUSH BP
  • 【Unity游戏开发】静态、动态合批与GPU Instancing

    https zhuanlan zhihu com p 356211912 前言 动态合批与静态合批其本质是对将多次绘制请求 在允许的条件下进行合并处理 减少cpu对gpu绘制请求的次数 达到提高性能的目的 目录 啥是合批 为啥要合批 调用D
  • socket通讯相互发送读取xml实例

    首先了解下socket通讯传输数据的特点 数据在网络传输时使用的都是字节流或字符流 Socket也不例外 所以我们发送数据的时候需要转换为字节发送 读取的时候也是以字节为单位读取 那么问题就在于socket通讯时 接收方并不知道此次数据有多
  • Python之Pandas绘图

    Pandas绘图
  • Qt --- 基本类

    位置和尺寸 在QT中我们常见的 点 线 尺寸 矩形 都被进行了封装 下面依次为大家介绍相关的类 QPoint QPoint类封装了我们常用用到的坐标点 x y 常用的 API如下 void QPoint setX int x void QP
  • CUDA8.0矩阵乘法例子解释(matrixMul.cpp)

    通过学习英伟达自带的例子matrixMul学CUDA库的使用 简略部分垃圾 只说核心代码 这个例子是实现 C A B的矩阵相乘 Use a larger block size for Fermi and above int block si
  • java:错误: 非法的表达式开始

    我写了这样一个代码 class Person private String name private int age Person System out println C name name age age Person String n
  • 记一道字节跳动的算法面试题

    来源公众号 苦逼的码农 作者 帅地 前几天有个朋友去面试字节跳动 面试官问了他一道链表相关的算法题 不过他一时之间没做出来 就来问了我一下 感觉这道题还不错 拿来讲一讲 题目 这其实是一道变形的链表反转题 大致描述如下 给定一个单链表的头节
  • CSAPP实验

    实验目的 1更好地熟悉和掌握计算机中整数和浮点数的二进制编码表示 2 实验中使用有限类型和数量的运算操作实现一组给定功能的函数 在此过程中加深对数据二进制编码表示的了解 3 熟悉linux基本操作命令 其中常用工具和程序开发环境 4 完善b