深入理解计算机系统LAB1实验报告.doc

上传人:苏美尔 文档编号:5732579 上传时间:2020-07-25 格式:DOC 页数:7 大小:96.50KB
返回 下载 相关 举报
深入理解计算机系统LAB1实验报告.doc_第1页
第1页 / 共7页
深入理解计算机系统LAB1实验报告.doc_第2页
第2页 / 共7页
深入理解计算机系统LAB1实验报告.doc_第3页
第3页 / 共7页
深入理解计算机系统LAB1实验报告.doc_第4页
第4页 / 共7页
深入理解计算机系统LAB1实验报告.doc_第5页
第5页 / 共7页
点击查看更多>>
资源描述

《深入理解计算机系统LAB1实验报告.doc》由会员分享,可在线阅读,更多相关《深入理解计算机系统LAB1实验报告.doc(7页珍藏版)》请在三一文库上搜索。

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)|(0x80000000&f); else if(f&0x7f800000)!=0x7f800000) f=f+0x00800000; return f;思路:先进行判断,如果阶码全零,则需要对尾数进行移位操作,并令阶码加一,判定符号位。如果阶码不为零,则只需要领阶码加一即可。当阶码全为1,不操作直接输出。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 科普知识


经营许可证编号:宁ICP备18001539号-1