深入理解计算机系统LAB1实验报告_第1页
深入理解计算机系统LAB1实验报告_第2页
深入理解计算机系统LAB1实验报告_第3页
深入理解计算机系统LAB1实验报告_第4页
深入理解计算机系统LAB1实验报告_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

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

文档简介

1、lab1实验报告语法检查:正确性检查:1. bitand源代码: return (x|y);思路:可以直接运用摩尔定律,写出与的等价形式。2. getbyte源代码: return (x(n3)&0xff;思路:向右移动3n位,再用11111111b按位与,截取出所需要的字节3. logicalshift源代码: int logic=(1n)n);思路:设置一个变量logic,并通过算数移位将其前n为设置成0,后面32-n位设置为1。利用这个变量按位与移位后的x即可。4. bitcount源代码:int bitcount(int x) int result; int half_one=(0x5

2、5)|(0x558); int one=(half_one)|(half_one16); int half_two=(0x33)|(0x338); int two=(half_two)|(half_two16); int half_three=(0x0f)|(0x0f8); int three=(half_three)|(half_three16); int four=(0xff)|(0xff16); int five=(0xff)|(0xff1)&one); result=(result&two)+(result2)&two); result=(result+(result4)&three;

3、 result=(result+(result8)&four; result=(result+(result16)&five; return result;思路:主要还是使用二分法,通过以为设置五个字符串:0101 0101 0101 0101 0101 0101 0101 01010011 0011 0011 0011 0011 0011 0011 00110000 1111 0000 1111 0000 1111 0000 11110000 0000 1111 1111 0000 0000 1111 11110000 0000 0000 0000 1111 1111 1111 1111分别

4、通过按位与统计1的个数,并将个数记录在下一个字符串1出现的位置。最后可以得到1的个数。5. bang源代码: return (x|(x+1)31)&1;思路:x和-x的机器数按位与,当x不为0是,其符号位一定为0。然后再利用移位得到其符号位即可。6. tmin源代码: return 131;思路:即得到最小负数0x8000 0000。可以通过移位得到。7. fitsbit源代码: int shift=n+33; return !(x(xshift);思路:shift=32-n。即先左移32-n位,在右移32-n位,即保留最后n位数。在与x异或,若两者相同表示x可被表示为一个n位整数,!0为1。

5、8. divpwr2源代码:int sign=x31;int one=(1n;思路:首先取得符号位,然后设置one=2n-1,如果x是正数,则two为0,即不用加,直接移位如果x为负数,加上偏置量之后在移位。9. negate源代码: return x+1;思路:即求负数,原数字按位取反再加一即可。10. ispositive源代码: return !(x31)|(!x);思路:这个看符号位就行了,通过移位把符号位提取出来。11. islessorequal源代码: int signx=x31; int signy=y31; int signsame=(x+(y)31)&(!(signxsig

6、ny); int signdiffer=signx&(!signy); return signdiffer|signsame;思路:首先获得两个符号位,然后分别就考虑负号位相同和不同的情况,当负号位相同,则利用减法,获取差的符号位;如果符号位不同,且x为负,y为正,则也成立。综合负号相同和不同的情况,可以得到最终结果。12. ilog2源代码:int ilog2(int x) int result=0; result=(!(x16)(result+8)(result+4)(result+2)(result+1); result=result+(!result)+(0)+(!(1x); retu

7、rn result;思路:先右移16位后若大于0即得到有效数字,否则得到0,判断最高位是否为0,若不为0,则包含2的16次方。即得到最高位的log数,同理其他。13. float_neg源代码:unsigned float_neg(unsigned uf) unsigned result; unsigned tmp; tmp=uf&(0x7fffffff); result=uf0x80000000; if(tmp0x7f800000) result=uf; return result;思路:将该数字的最高位进行取反。然后分类讨论,比较最高位为零时,是否大于0 11111111 0000 000

8、0 0000 0000 0000。即阶为最大是,此时,为nan,所以这个时候返回参数就可以啦。14. float_i2f源代码:unsigned float_i2f(int x) unsigned shiftleft=0; unsigned aftershift,tmp,flag; unsigned absx=x; unsigned sign=0; if(0=x) return 0; if(x0) sign=0x80000000; absx=-x; aftershift=absx; while(1) tmp=aftershift; aftershift0x0100) flag=1; else

9、if(aftershift&0x03ff)=0x0300) flag=1; else flag=0; return sign + (aftershift9)+(159-shiftleft)23)+flag;思路:int型整数在转化为float型数的时候需要注意的是负数的表示,在int型中负数使用补码的形式表示,而float直接表示,所以先要对负数进行转化。然后进行循环,每移位一次阶码记录一次。最后把得到的三部分综合起来即可。15. float_twice源代码:unsigned float_twice(unsigned uf) unsigned f=uf; if(f & 0x7f800000)=0) f=(f&0x007fffff)1)|(0x8000000

温馨提示

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

评论

0/150

提交评论