记录自己的学习过程

文章目录

  • 记录自己的学习过程
  • int conditional(int x, int y, int z)
  • int isNonNegative(int x)
  • int isGreater(int x, int y)
  • int absVal(int x)
  • int isPower2(int x)
  • unsigned float_neg(unsigned uf)
  • unsigned float_i2f(int x)

int conditional(int x, int y, int z)

功能:实现与三目运算符表达式 x ? y : z 具有等价功能的函数
主要是模仿三目运算符的逻辑

int conditional(int x, int y, int z) {//x不为0时结果为y,为0时结果为z.int test1,test2,test3;test1=(!!x);test1=(test1<<31)>>31; //获得!!x的值填充32位。test2=!x;test2=(test2<<31)>>31; //获得!x的值填充32位。test3=(test1&y)+(test2&z); //分别和y,z进行与运算即可得出结果。return test3;
}

int isNonNegative(int x)

功能:当 x >=0 时,返回1;否则返回0
判断符号位即可

int isNonNegative(int x) {//判断x的符号位int test1=x>>31;//为0xFFFFFFFF则要return0,为0x00000000要return1.test1=!test1; //使用!将其变为0与1.return test1;
}

int isGreater(int x, int y)

功能:当 x > y 时,返回1,否则返回0
可能有溢出的情况,所以将x和y分为同号和异号两种情况进行考虑
正 - 正 ——不会溢出,返回x-y-1符号位的取反即可(减1是为了排除相等的情况)
正 - 负 —— 函数必须 return 1
负 - 正 —— 函数必须 return 0,可以看到,异号状态返回值为y的符号位。
负 - 负——不会溢出,返回x-y-1符号位的取反即可(同理)

int isGreater(int x, int y) {//需要判断x与y同号和x与y异号的情况。int equalval=x^y;        //判断x与y相等及符号位是否相同。int subval=x+(~(y+1)+1); //计算x-y-1;int result=(((~subval)&(~equalval))+(y&equalval))>>31;//分别计算同号与异号的情况。//并取符号位。前一个为同号,后一个为异号result=result&0x01;return result;
}

int absVal(int x)

功能:计算x的绝对值
同样也是分为x为正和负两种情况考虑
若x为正数,则直接返回x
若x为负数,则返回~x+1

int absVal(int x) {//x为正则返回x, x为负,则返回~x+1;int result,signbit;signbit=x>>31;//获得signbit扩充到32位的01序列,为00...00(x为正数) 或 11...11(x为负数)result=((~signbit)&x)+(signbit&(~x+1));//利用符号位计算结果。//若x为正数,则后半段为0,前半段为x//若x为负数,则前半段为0,后半段为~x+1return result;
}

int isPower2(int x)

功能:判断x是否恰好等于 2^n,如果等于则返回1,否则返回0
考查2^n的位的性质
若 x为 2^n,则 x&(x-1)=0
假设 x为 2^5, 则 x=100000,x-1=011111。显然 x&(x-1)=0

但还需排除负数(即只有符号位为1的情况)和 0 的干扰
等价于判断 x>0
和上一个isGreater 函数方法类似,需要考虑 x<0时溢出的情况,所以分为x>=0和x<0两种情况

int isPower2(int x) {//首先2的幂有x&(x-1)为0的特征,然后只要判断x大于0(和isGreater判断方法一致)int signbit=(x>>31)&0x01;int signbit2=((x+~0x00)>>31)&0x01;int abzero=signbit+(signbit2&(~signbit));//判断是否大于0,大于0为0,否则为1int nature=x&(x+~0x00);       //性质符合为0int result=abzero+nature;//两者都满足的情况下为0,其他情况都不为0.return !result;
}

unsigned float_neg(unsigned uf)

功能:求浮点数f的相反数
说明:参数uf为浮点数f为在计算机中的二进制编码所对应的无符号数。返回值为浮点数f在计算机中的 二进编码所对应的无符号数。
合法的运算符:全部有符号数和无符号数的运算符、||、&&、if 和 while
注意:如果输入为NaN,则返回值等于uf
可使用的运算符数:10
难度:2

如题目要求,分为NaN情况和一般情况
NaN情况 :判断出来后,直接返回 uf 的值
NaN:即阶码位全为1,小数位不全为 0时为NaN
一般情况:根据 IEEE 754 原则,将 float 阶码位 ^ 1, 然后返回

unsigned float_neg(unsigned uf) {//分为NAN和规范数两种情况。unsigned result;int elsign=uf&0x7fffffff;    //排除符号位影响。int exp=elsign>>23;          //获得阶码位if((!(exp^0xff))&&(elsign^0x7f800000))//前一个判断阶码位是否全为1//后一个在前一个基础上判断小数字段是否不全为0return uf;result=uf^0x80000000;return result;
}

unsigned float_i2f(int x)

功能:返回浮点数(float)x在计算机中的二进制编码所对应的无符号数
即把 x 转换为 浮点数类型对应的无符号数字
就是把(float)x的位表示放在一个无符号变量中返回

根据IEEE 754原则和向偶取整原则一步一步进行实现

IEEE 754 中 float x=(-1)^signbit * 2^(exp-Bias)(1+frac)
例:float f=15213.0 ,其二进制值为0011 1011 0110 1101. 在IEEE 754中
其位表示为:(-1)^0 * (1.1101101101101) * 2^13
exp=13+bias(在float中为127)=1000 1100(二进制)
frac=1101101101101…0(小数去掉1,共23位)
s=0

向偶舍入:(四舍六入五成双)
即规定的位后面>100,则进1
若<100,则舍去
若等于100,若此位为1,则进1;此位为0,则舍去。

unsigned float_i2f(int x) {//即将x变为float型。按照IEEE和向偶取整的规则即可。int signbit,highbit,exp,fracbits,flag;unsigned temp,result;if(!x)return x;             //由于规范数情况不包含0,所以先处理0情况。signbit=(x>>31)&0x01;if(signbit)x=~x+1;              //获得符号位,并将x变为正值。highbit=0;temp=x;while(!(temp&0x80000000)){temp<<=1;highbit++;}                    //获得x的最高有效位,即确定fraction的位数。temp=temp<<1;exp=127+31-highbit;  //根据单精度浮点数规则计算出exp,和fraction位数。fracbits=31-highbit;flag=0;               //进行向偶舍入if((temp&0x1ff)>0x100)flag=1;              //出现在规定位置后大于0b100的情况就进1.if((temp&0x3ff)==0x300)flag=1;              //出现最后一位为1,且下一位为1的情况也进1(向偶取整)result=(signbit<<31)+(exp<<23)+(temp>>9)+flag;//计算最终结果return result;
}

Data Lab 2(深入理解计算机系统)相关推荐

  1. 深入理解计算机系统(CSAPP)含lab详解 完结

    文章目录 深入理解计算机操作系统-第一章 1.1 信息就是位 + 上下文 1.2 程序被其他程序翻译成不同的格式 1.3 了解编译系统如何工作是大有益处的 1.4 处理器读并解释储存在内存中的指令 1 ...

  2. (深入理解计算机系统) bss段,data段、text段、堆(heap)和栈(stack)(C/C++存储类型总结)(内存管理)

    文章目录 bss段 data段 text段 堆(heap) 栈(stack) 一个程序本质上都是由 bss段.data段.text段三个组成的. 存储类型总结 bss段 bss段(bss segmen ...

  3. 《深入理解计算机系统》实验二Bomb Lab下载和官方文档机翻

    前言 <深入理解计算机系统>官网:http://csapp.cs.cmu.edu/3e/labs.html 该篇文章是实验二Bomb Lab的Writeup机翻. 原文:http://cs ...

  4. 《深入理解计算机系统》实验二Bomb Lab

    前言 <深入理解计算机系统>实验二Bomb Lab的下载和官网文档的机翻请看 <深入理解计算机系统>实验二Bomb Lab下载和官方文档机翻 用的调试工具是gdb,用到的指令如 ...

  5. 《深入理解计算机系统》实验四Architecture Lab下载和官方文档机翻

    前言 <深入理解计算机系统>官网:http://csapp.cs.cmu.edu/3e/labs.html 该篇文章是是实验四Architecture Lab中的Writeup(archl ...

  6. 《深入理解计算机系统》Y86-64实验四Architecture Lab环境安装

    前言 第四章提到的Y86-64和实验四Architecture Lab的环境安装. 先从官网下载文件: <深入理解计算机系统>官网:http://csapp.cs.cmu.edu/3e/l ...

  7. 《深入理解计算机系统》:Cache Lab

    第1关:Part A 任务描述 本关任务:完成csim.c文件,实现一个cache simulator,模拟Cache的访问过程.替换算法采用最近最少使用替换策略(LRU). 可参考资料:官网实验文档 ...

  8. App Data Lab——计算机系统实验lab2

    实验题目 APP Data Lab 实验目的: Your goal is to modify your copy of bits.c so that it passes all the tests i ...

  9. CSAPP Lab1:Data Lab (虚拟机安装+Lab环境配置+函数实现)

    目录 前言 一.WIN10虚拟机安装 1.关于Vmware Workstation,Ubuntu和Vmware tools 2.安装步骤 二.Lab环境配置(安装GCC编译套装) 三.README及实 ...

  10. 【组队学习】【32期】深入理解计算机系统

    深入理解计算机系统 航路开辟者:李岳昆.易远哲 领航员:初晓宇 航海士:叶前坤.沈豪 基本信息 开源内容:https://github.com/datawhalechina/team-learning ...

最新文章

  1. 【FFmpeg】ffmpeg工具源码分析(三):分配过滤器内存(宏GROW_ARRAY)详解
  2. enter对应的keycode_键盘对应数字-keycode值大全
  3. js-window对象的方法和属性资料
  4. 持志助中华 九州初志开创国内集群存储新时代
  5. 水声定位中的CBF波束形成原理
  6. Break,Continue,Return 傻傻分不清楚
  7. POI操作Excel:cell的背景颜色类型
  8. 【20120517】【早晨】
  9. 安谋科技发布新业务品牌“核芯动力”,先手布局智能计算产业
  10. or函数 java_Java OptionalInt orElseGet()用法及代码示例
  11. window 和 linux 环境下杀死tomcat进程——也可以解决其他端口被占用的问题
  12. CoreBluetooth Central模式 Swift版
  13. 裴礼文3.2.34解答
  14. C-Lodop使用及常见错误排查
  15. 语音识别之前端处理及相关算法
  16. 第二天学习笔记:(MDN HTML学习、web安全策略与常见攻击、语义化)
  17. Coursera | Applied Plotting, Charting Data Representation in Python(UMich)| Assignment4
  18. Win7宝典 / Windows7宝典
  19. tf.extract_image_patches以及pytorch的extract_patches
  20. GAMES-101-个人总结归纳-Shading

热门文章

  1. cf两边黑屏怎么解决win10_电脑黑屏怎么解决
  2. win10安装过程修改esp分区吗_WIN10系统安装失败一例
  3. 解决Permission denied: user=root, access=WRITE, inode=“/“:root:supergroup:drwxr-xr-x问题
  4. 监听浏览器刷新事件,拦截浏览器返回,js监听移动端浏览器页面显示、隐藏
  5. vue如何区别浏览器刷新和关闭
  6. php url中文转码
  7. Rust 智能指针(二)
  8. 主成分分析(PCA)步骤及代码
  9. 如果让markdown的图片变清晰/改变大小
  10. 计算机教案制作电子表格,制作电子表格教案