CSAPP实验1:datalab
前言
CSAPP上的实验还是十分有趣的,尤其是其自动评分系统。做完了实验之后自己也确实对知识的理解更加深入了。有关CSAPP的知识以后或许我会再写博客,现在则先把实验写写博客吧
百度网盘下载实验文档
提取码:kdx4
实验
题1-2
//1
/* * bitXor - x^y using only ~ and & * Example: bitXor(4, 5) = 1* Legal ops: ~ &* Max ops: 14* Rating: 1*/采用学过的摩尔定律分解即可
int bitXor(int x, int y) {return ~(~(x&~y)&(~(~x&y)));
}
/* * tmin - return minimum two's complement integer * Legal ops: ! ~ & ^ | + << >>* Max ops: 4* Rating: 1*/很容易理解
int tmin(void) {return 1<<31;
题3-6
//2
/** isTmax - returns 1 if x is the maximum, two's complement number,* and 0 otherwise * Legal ops: ! ~ & ^ | +* Max ops: 10* Rating: 1*/这个我做错了,不能用<<我没看到-.-
int isTmax(int x) {return !(x^(~(1<<31)));
}
正确解法之一:
int isTmax(int x)
{return !((x + 1) ^ ~x) & !!(x + 1);
}
/* * allOddBits - return 1 if all odd-numbered bits in word set to 1* where bits are numbered from 0 (least significant) to 31 (most significant)* Examples allOddBits(0xFFFFFFFD) = 0, allOddBits(0xAAAAAAAA) = 1* Legal ops: ! ~ & ^ | + << >>* Max ops: 12* Rating: 2*///这个我的ops超了,不是优解
int allOddBits(int x) {int flag=0xAA;return !((flag&x)^flag)&!((flag<<8&x)^(flag<<8))&!((flag<<16&x)^(flag<<16))&!((flag<<24&x)^(flag<<24));
}
/* * negate - return -x * Example: negate(1) = -1.* Legal ops: ! ~ & ^ | + << >>* Max ops: 5* Rating: 2*/相反数取反加一即可,对于Tmin没用
int negate(int x) {return ~x+1;
}
题7-9
//3
/* * isAsciiDigit - return 1 if 0x30 <= x <= 0x39 (ASCII codes for characters '0' to '9')* Example: isAsciiDigit(0x35) = 1.* isAsciiDigit(0x3a) = 0.* isAsciiDigit(0x05) = 0.* Legal ops: ! ~ & ^ | + << >>* Max ops: 15* Rating: 3*/0x30=>001100000x39=>00111001假设其二进制位分别是a1...a8可以知道a1-a4是永远不变的,如果不同就可以直接pass掉了,当a5等于1时,则a6 a7必须都为0当a5等于0时则随意
int isAsciiDigit(int x) {int tmp=0xf;return (!((~tmp&x)^0x30))&((!((1<<3)&x))|((!(2&x))&(!(4&x))));
}
/* * conditional - same as x ? y : z * Example: conditional(2,4,5) = 4* Legal ops: ! ~ & ^ | + << >>* Max ops: 16* Rating: 3*/因为要返回y或者z,可以想到需要用+运算符,利用0xffffffff+1等于0,同时自己去与运算不会改变,而0做与运算则正好全为0
int conditional(int x, int y, int z) {int tmp=(!!x+(~0));return (~tmp&y)+(tmp&z);
}
/* * isLessOrEqual - if x <= y then return 1, else return 0 * Example: isLessOrEqual(4,5) = 1.* Legal ops: ! ~ & ^ | + << >>* Max ops: 24* Rating: 3*/可以想到利用y+~x+1来得到y-x,之后判断其正负即可,但是需要考虑到溢出的情况,考虑到溢出只有两种情况,即x与y异号,分类讨论即可。
int isLessOrEqual(int x, int y) {int tmp=y+(~x+1);int tmp1=!!((1<<31)&x)&!((1<<31)&y);int tmp2=!!((1<<31)&x)|!((1<<31)&y);return (!((1<<31)&tmp)|tmp1)&tmp2;
}
题10-end
/* * logicalNeg - implement the ! operator, using all of * the legal operators except !* Examples: logicalNeg(3) = 0, logicalNeg(0) = 1* Legal ops: ~ & ^ | + << >>* Max ops: 12* Rating: 4 */首先通过把最高位为1后的位都填充为1,然后判断最低位是否为一,无论是负数还是整数都至少有一个bit位为1
int logicalNeg(int x) {x=(x>>16)|x;x=(x>>8)|x;x=(x>>4)|x;x=(x>>2)|x;x=(x>>1)|x;return (x&1)^1;
}
/* howManyBits - return the minimum number of bits required to represent x in* two's complement* Examples: howManyBits(12) = 5* howManyBits(298) = 10* howManyBits(-5) = 4* howManyBits(0) = 1* howManyBits(-1) = 1* howManyBits(0x80000000) = 32* Legal ops: ! ~ & ^ | + << >>* Max ops: 90* Rating: 4*/首先从左到右扫描x的bit位这题极为复杂,我也是看别人的思路写出来的,通过对正数和负数的分析,可以知道
一定是相邻的两个bit异号时得到最高位,其中正数是0 1,其中0是符号位,而负数则相反是 1 0,
其中1是符号位,通过分析可以知道对负数取反后的正数其所求位数与该负数没有区别,于是可以把负数都取反,利用conditional函数可以做到永远得到是正数(0除外),之后根据logicalNel函数里
一样,把最高位1后的所有位都变成1,然后利用bitcount求其1的个数即为所需的位数,当然还需要加1个bit的符号位。其中求bitcount采用了分治的思想,可以减少运算符。
int howManyBits(int x) {int y=~x;int tmp1=!((1<<31)&x);int tmp2=!((1<<31)&y);tmp1=~tmp1+1;tmp2=~tmp2+1;int tmp=(tmp1&x)+(tmp2&y);tmp=tmp|tmp>>1;tmp=tmp|tmp>>2;tmp=tmp|tmp>>4;tmp=tmp|tmp>>8;tmp=tmp|tmp>>16;int mask=1;mask=(mask<<8)|1;mask=(mask<<8)|1;mask=(mask<<8)|1;int sum=0;sum+=tmp&mask;sum+=(tmp>>1)&mask;sum+=(tmp>>2)&mask;sum+=(tmp>>3)&mask;sum+=(tmp>>4)&mask;sum+=(tmp>>5)&mask;sum+=(tmp>>6)&mask;sum+=(tmp>>7)&mask;return ((sum&0xff)+((sum>>8)&0xff)+((sum>>16)&0xff)+((sum>>24)&0xff))+1;
}
//float
/* * floatScale2 - Return bit-level equivalent of expression 2*f for* floating point argument f.* Both the argument and result are passed as unsigned int's, but* they are to be interpreted as the bit-level representation of* single-precision floating point values.* When argument is NaN, return argument* Legal ops: Any integer/unsigned operations incl. ||, &&. also if, while* Max ops: 30* Rating: 4*/对于单精度浮点数,其最高位为符号位,然后8位指数位,23位底数位,当指数位为0是是非规格化数,此时底数是0.x1x2x3...这样子,当指数位非零时是规格化数,此时底数是1.x1x2x3...这样子同时当指数位全1时,若是底数位为0则代表无穷大,如果底数不为0,则代表NaN。当然其真正的指数还想需要减去127。由于基本上没有了运算符的限制,所以这后三题多费些时间还是能够做出来的。
unsigned floatScale2(unsigned uf) {unsigned exp=0;exp=((0x7fffffff)&uf)>>23;//cout<<exp<<endl;if(exp==0xff)return uf;else if(exp==0){return (1<<31&uf)|(uf<<1);}exp+=1;if(exp==0xff){return ((1<<31&uf))|(exp<<23);}return (uf&0x807fffff)|(exp<<23);
}
/* * floatFloat2Int - Return bit-level equivalent of expression (int) f* for floating point argument f.* Argument is passed as unsigned int, but* it is to be interpreted as the bit-level representation of a* single-precision floating point value.* Anything out of range (including NaN and infinity) should return* 0x80000000u.* Legal ops: Any integer/unsigned operations incl. ||, &&. also if, while* Max ops: 30* Rating: 4*/
int floatFloat2Int(unsigned uf) {int max=0x7fffffff;int exp=(uf&0x7fffffff)>>23;if(exp==0xff)return 0x80000000u;int e=exp-127;if(e<0)return 0;unsigned sum=0;int tmp=uf&0x7fffff;for(int i=23;i>=0&&i>=23-e;i--){sum=sum*2+(tmp>>i);int shift=(32-i+1);tmp=tmp<<shift;tmp=tmp>>shift;if(sum>max)return 0x80000000u;}unsigned res=1;for(int i=1;i<=e;i++){res*=2;if(res>max)return 0x80000000u;}int ops=(!!((1<<31)&uf)==1)?-1:1;//cout<<ops<<endl;unsigned ans=res+sum;if(ans>max)return 0x80000000u;return (int)(res+sum)*ops;
}
/* * floatPower2 - Return bit-level equivalent of the expression 2.0^x* (2.0 raised to the power x) for any 32-bit integer x.** The unsigned value that is returned should have the identical bit* representation as the single-precision floating-point number 2.0^x.* If the result is too small to be represented as a denorm, return* 0. If too large, return +INF.* * Legal ops: Any integer/unsigned operations incl. ||, &&. Also if, while * Max ops: 30 * Rating: 4*/
unsigned floatPower2(int x) {unsigned ans=0;int INF=0x7f800000;if(x<-150)return 0;if(x>127)return INF;int exp=x+127;if(x==-127){return 0x7fffff;}if(x<-127){int tmp=~x-127;ans=ans|(1<<(23-tmp+1));}else{ans=ans|(exp<<23);}return ans;}
实验结果
CSAPP实验1:datalab相关推荐
- CSAPP实验记录(一):环境配置datalab
CSAPP实验记录(一):环境配置&datalab 1.环境配置 下载Ubuntu虚拟机.我之前用的是Ubuntu18.04,非常坑,强烈建议换成Ubuntu20.04 windows和Ubu ...
- CSAPP实验——DataLab
CSAPP - DataLab CSAPP实验记录 Data Lab 实验的内容是关于计算机信息的表示,主要包括位操作.整型及浮点型相关知识. 题目列表 名称 任务 难度 bitXor(x, y) ...
- CSAPP实验二——bomb lab实验
CSAPP实验二-- bomb lab实验 实验前准备 第一部分(phase_1) 第二部分(phase_2) 第三部分(phase_3) 第四部分(phase_4) 第五部分(phase_5) 第六 ...
- CSAPP实验记录(二)Bomb Lab
CSAPP实验记录(二)Bomb Lab 二进制炸弹是由一系列阶段组成的程序.每个阶段都要求你在 stdin 上键入一个特定的字符串.如果你输入了正确的字符串,那么这个阶段就被拆除,炸弹进入下一个阶段 ...
- csapp实验摘选 I Data Lab ——小小菜下士的第一篇博客
csapp实验摘选 I Data Lab --小小菜下士的第一篇博客 注:这是我的第一篇博客,试图在通往程序猿的路上踏出坚实的一步. --小小菜下士 实验来自: [读厚 CSAPP]I Data La ...
- csapp实验记录 - Cachelab partA
Cachelab partA 这是该实验的 partA 部分,主要是用 c 语言模拟 cpu 对cache的存取过程,以及其缓存命中,不命中和不命中时的替换的情况 实验准备 实验的环境在 Linux ...
- 【计算机系统基础bomb lab】CSAPP实验:Bomb Lab
[计算机系统基础bomb lab]CSAPP实验:Bomb Lab CSAPP 实验:Bomb Lab 实验内容简述 实验环境 实验过程:phase 1 phase 1 调试过程 实验过程:phase ...
- CSAPP实验记录(1)--------- DataLab
Datalab Datalab实验是关于数据的机器级表示,实验要求实现给定的位级运算符,同时要满足一些要求,如只能使用某些限定的运算符,运算符总数不超过某数字等.第一次刷感觉难度还是很大的. 题目一: ...
- 深入理解计算机系统(CSAPP) 实验详解:DataLab
更新历史 20200911开始做这个实验 20200915更新文章-题目更新到isTmax 20200918更新文章-题目更新到isAsciiDigit 20200927更新文章-题目更新到isLes ...
最新文章
- 三十六、请求分页管理方式
- SpringBoot整合HBase将数据写入Docker中的HBase
- html火影忍者网页设计作品,纯css3制作的火影忍者写轮眼开眼至轮回眼及进化过程实例...
- php jquery 弹窗提示框,jQuery实现消息弹出框效果
- linux中split分割文件打开方式,Linux使用split对文件进行切分和合并的方法
- php 标签库,PHP.MVC的模板标签系统之模板标签库
- PHP地图规划骑行路径,骑行路线规划
- php回调后门,PHP 回调后门笔记
- NOIP2016 DAY2 T3 愤怒的小鸟
- 2016年中国大学生程序设计竞赛(合肥)-重现赛
- 又延伸到socket去了。
- 制作一个小木马的步骤
- windows 环境下 0x色彩对应表
- 全球供应链报告显示,2020年中国采购业一枝独秀
- 如何一次性删除PPT中所有动画效果?
- 蓝桥杯嵌入式竞赛-数码管学习笔记(个人备份,以便日后查找)
- 12月15-16日:跟着猫叔写代码学习api接口开发小程序
- 读书的理由——好书推荐
- error processing condition on org.autoconfigure.transaction.TransactionAutoConfiguration$Transaction
- 三、使用Arduino控制WS2812B灯
热门文章
- 数据结构与算法A实验六图论---7-4 公路村村通(最小生成树Prime和Kruskal算法)
- 移动办公oa管理软件的五大选择要素有哪些?
- 三维实景业务中的前端技术
- Vue项目初期报错问题记录大全
- Hands-On Mobile Prototyping for UX Designers UX设计师的实际手机原型设计 Lynda课程中文字幕
- Oledcomm——全球5G/LiFi技术领航者
- RH358访问基于块的网络存储--自动化配置iSCSI initiator
- Iconfont-阿里巴巴矢量图标库 用 github账户无法登录
- 永远不可能学会的数论之基础数论(例题)
- 树莓派更换源后update/upgrade更新后无法启动