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

更新时间:2023-11-02 01:45:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

LAB1实验报告

语法检查:

正确性检查:

1. bitAnd 源代码:

return ~(~x|~y);

思路:

可以直接运用摩尔定律,写出与的等价形式。 2. getByte 源代码:

return (x>>(n<<3))&0xff;

思路:

向右移动3n位,再用11111111B按位与,截取出所需要的字节 3. logicalShift 源代码:

int logic=~(((1<<31)>>n)<<1); return logic&(x>>n);

思路:

设置一个变量logic,并通过算数移位将其前n为设置成0,后面32-n位设置为1。利用这个变量按位与移位后的x即可。 4. bitCount 源代码:

int bitCount(intx) { int result;

int half_one=(0x55)|(0x55<<8); int one=(half_one)|(half_one<<16); int half_two=(0x33)|(0x33<<8); int two=(half_two)|(half_two<<16); int half_three=(0x0f)|(0x0f<<8);

int three=(half_three)|(half_three<<16); int four=(0xff)|(0xff<<16); int five=(0xff)|(0xff<<8);

result=(x&one)+((x>>1)&one);

result=(result&two)+((result>>2)&two); result=(result+(result>>4))&three; result=(result+(result>>8))&four; result=(result+(result>>16))&five; return result; }

思路:

主要还是使用二分法,通过以为设置五个字符串: 010101010101010101010101 0101 0101 0011 0011 0011 0011 0011 0011 0011 0011 0000 1111 0000 1111 0000 1111 0000 1111 0000 0000 1111 1111 0000 0000 1111 1111 0000 0000 0000 0000 1111 1111 1111 1111

分别通过按位与统计1的个数,并将个数记录在下一个字符串1出现的位置。最后可以得到1的个数。 5. bang 源代码:

return (~((x|(~x+1))>>31))&1;

思路:

X和-X的机器数按位与,当X不为0是,其符号位一定为0。然后再利用移位得到其符号位即可。 6. tmin 源代码:

return 1<<31;

思路:

即得到最小负数0x8000 0000。可以通过移位得到。

7. fitsBit 源代码:

int shift=~n+33;

return !(x^((x<>shift));

思路:

shift=32-n。即先左移32-n位,在右移32-n位,即保留最后n位数。在与x异或,若两者相同表示x可被表示为一个n位整数,!0为1。 8. divpwr2 源代码:

int sign=x>>31; int one=(1<

return (x+two)>>n;

思路:

首先取得符号位,然后设置one=2^n-1,如果x是正数,则two为0,即不用加,直接移位如果x为负数,加上偏置量之后在移位。 9. negate 源代码:

return ~x+1;

思路:

即求负数,原数字按位取反再加一即可。 10. isPositive 源代码:

return !((x>>31)|(!x));

思路:

这个看符号位就行了,通过移位把符号位提取出来。

11. isLessOrEqual 源代码:

int signx=x>>31; int signy=y>>31;

int signSame=((x+(~y))>>31)&(!(signx^signy)); int signDiffer=signx&(!signy); return signDiffer|signSame;

思路:

首先获得两个符号位,然后分别就考虑负号位相同和不同的情况,当负号位相同,则利用减法,获取差的符号位;如果符号位不同,且x为负,y为正,则也成立。综合负号相同和不同的情况,可以得到最终结果。 12. ilog2 源代码:

int ilog2(intx) { int result=0;

result=(!!(x>>16))<<4;

result=result+((!!(x>>(result+8)))<<3); result=result+((!!(x>>(result+4)))<<2); result=result+((!!(x>>(result+2)))<<1); result=result+(!!(x>>(result+1))); result=result+(!!result)+(~0)+(!(1^x)); return result; }

思路:

先右移16位后若大于0即得到有效数字,否则得到0,判断最高位是否为0,若不为0,则包含2的16次方。即得到最高位的log数,同理其他。 13. float_neg 源代码:

unsigned float_neg(unsigneduf) { unsigned result; unsigned tmp;

tmp=uf&(0x7fffffff); result=uf^0x80000000; if(tmp>0x7f800000) }

result=uf; return result;

思路:

将该数字的最高位进行取反。然后分类讨论,比较最高位为零时,是否大于 0 11111111 0000 0000 0000 0000 0000。即阶为最大是,此时,为NaN,所以这个时候返回参数就可以啦。 14. float_i2f 源代码:

unsigned float_i2f(intx) { unsigned shiftleft=0;

unsigned aftershift,tmp,flag; unsigned absx=x; unsigned sign=0; if(0==x) }

aftershift=absx; while(1){ }

if((aftershift & 0x01ff)>0x0100)

flag=1; flag=1;

elseif((aftershift&0x03ff)==0x0300) else

tmp=aftershift; aftershift<<=1; shiftleft++; if(tmp&0x80000000)

break; return 0;

sign=0x80000000; absx=-x; if(x<0){

flag=0;

return sign + (aftershift>>9)+((159-shiftleft)<<23)+flag; }

思路:

Int型整数在转化为float型数的时候需要注意的是负数的表示,在int型中负数使用补码的形式表示,而float直接表示,所以先要对负数进行转化。然后进行循环,每移位一次阶码记录一次。最后把得到的三部分综合起来即可。 15. float_twice 源代码:

unsigned float_twice(unsigneduf) { unsigned f=uf;

if((f & 0x7f800000)==0){ }

elseif((f&0x7f800000)!=0x7f800000){

return f; }

}

f=f+0x00800000;

f=((f&0x007fffff)<<1)|(0x80000000&f);

思路:

先进行判断,如果阶码全零,则需要对尾数进行移位操作,并令阶码加一,判定符号位。如果阶码不为零,则只需要领阶码加一即可。当阶码全为1,不操作直接输出。

本文来源:https://www.bwwdw.com/article/bav2.html

Top