深入理解计算机系统LAB1实验报告_第1页
深入理解计算机系统LAB1实验报告_第2页
深入理解计算机系统LAB1实验报告_第3页
深入理解计算机系统LAB1实验报告_第4页
深入理解计算机系统LAB1实验报告_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、LAB1实验报告语法检查:正确性检查:1. bitAnd源代码:return(x|y);思路:可以直接运用摩尔定律,写出与的等价形式。2. getByte源代码:return(x(n3)&0xff;思路:向右移动3n位,再用B按位与,截取出所需要的字节3. logicalShift源代码:intlogic=(1n)n);思路:设置一个变量logic,并通过算数移位将其前n为设置成0,后面32-n位设置为1。利用这个变量按位与移位后的x即可。4. bitCount源代码:intbitCount(intx)intresult;inthalf_one=(0x55)|(0x558);intone=(h

2、alf_one)|(half_one16);inthalf_two=(0x33)|(0x338);inttwo=(half_two)|(half_two16);inthalf_three=(0x0f)|(0x0f8);intthree=(half_three)|(half_three16);intfour=(0xff)|(0xff16);intfive=(0xff)|(0xff1)&one);result=(result&two)+(result2)&two);result=(result+(result4)&three;result=(result+(result8)&four;result

3、=(result+(result16)&five;returnresult;思路:主要还是使用二分法,通过以为设置五个字符串:0101010101010101010101010101010100110011001100110011001100110011000011110000111100001111000011110000000011111111000000001111111100000000000000001111111111111111分别通过按位与统计1的个数,并将个数记录在下一个字符串1出现的位置。最后可以得到1的个数。5. bang源代码:return(x|(x+1)31)&1;思

4、路:X和-X的机器数按位与,当X不为0是,其符号位一定为00然后再利用移位得到其符号位即可。6. tmin源代码:return131;思路:即得到最小负数0x80000000。可以通过移位得到。7. fitsBit源代码:intshift=n+33;return!(xA(xshift);思路:shift=32-n。即先左移32-n位,在右移32-n位,即保留最后n位数。在与x异或,若两者相同表示x可被表示为一个n位整数,!0为1。8. divpwr2源代码:intsign=x31;intone=(1n;思路:首先取得符号位,然后设置one=2An-1,如果x是正数,则two为0,即不用力口,直

5、接移位如果x为负数,加上偏置量之后在移位。9. negate源代码:returnx+1;思路:即求负数,原数字按位取反再加一即可。10. isPositive源代码:return!(x31)|(!x);思路:这个看符号位就行了,通过移位把符号位提取出来。11. isLessOrEqual源代码:intsignx=x31;intsigny=y31;intsignSame=(x+(y)31)&(!(signxAsigny);intsignDiffer=signx&(!signy);returnsignDiffer|signSame;思路:首先获得两个符号位,然后分别就考虑负号位相同和不同的情况,当

6、负号位相同,则利用减法,获取差的符号位;如果符号位不同,且x为负,y为正,则也成立。综合负号相同和不同的情况,可以得到最终结果。12. ilog2源代码:intilog2(intx)intresult=0;result=(!(x16)(result+8)(result+4)(result+1);x(result+2)0x7f800000)result=uf;returnresult;思路:将该数字的最高位进行取反。然后分类讨论,比较最高位为零时,是否大于000000000000000000000。即阶为最大是,此时,为NaN所以这个时候返回参数就可以啦。14. float_i2f源代码:uns

7、ignedfloat_i2f(intx)unsignedshiftleft=0;unsignedaftershift,tmp,flag;unsignedabsx=x;unsignedsign=0;if(0=x)return0;if(x0)sign=0x;absx=-x;aftershift=absx;while(1)tmp=aftershift;aftershift0x0100)flag=1;elseif(aftershift&0x03ff)=0x0300)flag=1;elseflag=0;returnsign+(aftershift9)+(159-shiftleft)23)+flag;思路:Int型整数在转化为float型数的时候需要注意的是负数的表示,在int型中负数使用补码的形式表示,而float直接表示,所以先要对负数进行转化。然后进行循环,每移位一次阶码记录一次。最后把得到的三部分综合起来即可。15. float_twice源代码:unsignedfloat_twice(unsigneduf)unsignedf=uf;if(f&0x7f800000)=0)f=(f&0x007fffff)1)|(0x&f);elseif(f&0x

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论