计组实验datalabhandout实验报告材料.docx
- 文档编号:643957
- 上传时间:2022-10-11
- 格式:DOCX
- 页数:8
- 大小:20.05KB
计组实验datalabhandout实验报告材料.docx
《计组实验datalabhandout实验报告材料.docx》由会员分享,可在线阅读,更多相关《计组实验datalabhandout实验报告材料.docx(8页珍藏版)》请在冰豆网上搜索。
计组实验datalabhandout实验报告材料
计算机组成实验
实验1:
实验题目:
datalab-handout
实验目的:
根据bits.c中的要求补全其中的函数,并根据README中的要求在linux环境下检测函数是否符合要求。
实验环境:
Ubuntu14.04x86系统
实验内容及操作步骤:
intbitAnd(intx,inty){
return~((~x)|(~y));
}
运用了德摩定律,~((~x)|(~y))=(~(~x))&(~(~y))=x&y。
intgetByte(intx,intn){
return(x>>(n<<3))&255;
}
要从x中提取一个字节,而字节编号为0~3。
一个字节为8位2进制。
n<<3即为n*8位。
x>>(n<<3)即为x只保留下除去最后n*8位剩下的部分。
再&255则只保留剩下的最右一个字节。
得出的结果便为编号指定要提取的那个字节。
intlogicalShift(intx,intn){
intmask=~(((1<<31)>>n)<<1);
returnmask&(x>>n);
}
~(((1<<31)>>n)<<1)即为232-n-1,也就是mask=(000⋯011111⋯1)(2n个0,31-n个1)。
再mask&(x>>n)即为将x算术右移n位后并上mask这个前n位为0的掩码,使当x为负数时位移补1换为补0。
intbitCount(intx){
intresult;
inttmp_mask1=(0x55)|(0x55<<8);
intmask1=(tmp_mask1)|(tmp_mask1<<16);
inttmp_mask2=(0x33)|(0x33<<8);
intmask2=(tmp_mask2)|(tmp_mask2<<16);
inttmp_mask3=(0x0f)|(0x0f<<8);
intmask3=(tmpmask3)|(tmpmask3<<16);
intmask4=(0xff)|(0xff<<16);
intmask5=(0xff)|(0xff<<8);
result=(x&mask1)+((x>>1)&mask1);result=(result&mask2)+((result>>2)&mask2);
result=(result+(result>>4))&mask3;
result=(result+(result>>8))&mask4;
result=(result+(result>>16))&mask5;
returnresult;
}
本题采用二分法,先计算x每两位中1的个数,并用对应的两位来储存这个个数。
然后计算每四位1的个数,再用对应的四位进行储存。
依次类推,最后整合得到16位中1的个数,即为x中1的个数并输出。
intbang(intx){
return(~((x|(~x+1))>>31))&1;
}
(x|(~x+1)即当x为0时,结果为(00⋯0)2(31个0)。
其余情况最首位均为1。
因此右移31位后再取反只有x=0时最后一位为1。
再&1取最后一位。
因此当x=0时得到1,其余情况得到0。
inttmin(void){
return1<<31;
}
1<<31即(100⋯0)2(31个0)。
其中1是符号位。
即为负零,以表示最小的整数。
intfitsBits(intx,intn){
intshiftNumber=~n+33;
return!
(x^((x<
}
shiftNumber=~n+33即为-1-n+33=32-n,((x<
在与x按位异或并逻辑取反,若两者两同即x可被表示为一个n位整数,结果为!
0,即返回为1。
两者不同则不可表示为n位整数,结果为!
(一个非零数),返回0。
intdivpwr2(intx,intn){
intsignx=x>>31;
intmask=(1< intbias=signx&mask; return(x+bias)>>n; } signx=x>>31为取x的符号位,mask=(1< (x+bias)>>n当x为正数即x>>n,得到结果符合要求。 当x为负数时,需要加上偏置量2n-1得到预期结果,因此加上signx,得到结果符合要求。 intnegate(intx){ return~x+1; } ~x+1即-1-x+1=-x。 得到结果正确。 intisPositive(intx){ return! ((x>>31)|(! x)); //return~(x>>31)&! ! x } (x>>31)即取x的符号位,! x为逻辑取反,当x=0时! x=1,其他情况均为0.(x>>31)|(! x)即当x=0时得到1,x为负数得到1,x为正数得到0。 再进行逻辑取反,即当x为正数时返回1,x为0或负数时返回0。 intisLessOrEqual(intx,inty){ intsignx=x>>31;//判断符号 intsigny=y>>31; intsignSame=((x+(~y))>>31)|(! (signx^signy));//判断是否小于等于 intsignDiffer=signx&(! signy); returnsignDiffer|signSame; } intsx=! ! (x>>31);//判断符号 intsy=! ! (y>>31); intz=y+(~x+1);//y-x ints=! (z>>31); return(! (sx^sy)&s)|((sx^sy)&sx); /*intdifference=(~x+1)+y;/*y-x*/ return((x&~y)|(x&~difference)|(~y&~difference))>>31&0x1;/*通过x,y, difference的卡诺图求解*/ */ 补码=反码+1 前两步取x、y的符号位,第三步中(x+(~y))>>31为当x-y-1为负数时取1,! (signx^signy)为两者相同时取1,两者相或即x<=y时signSame为1,第四步即当x<0,y>0时signDiffer为1。 最后一步即当x<0,y>0时必返回1,其余情况则x<=y返回1。 效果即为如果x<=y,则返回1,否则返回0。 intilog2(intx){ intbitsNumber=0; bitsNumber=(! ! (x>>16))<<4; bitsNumber=bitsNumber+((! ! (x>>(bitsNumber+8)))<<3); bitsNumber=bitsNumber+((! ! (x>>(bitsNumber+4)))<<2); bitsNumber=bitsNumber+((! ! (x>>(bitsNumber+2)))<<1);bitsNumber=bitsNumber+(! ! (x>>(bitsNumbel47r+1)));bitsNumber=bitsNumber+(! ! bitsNumber)+(~0)+(! (1^x));returnbitsNumber; } /*intilog2(intx){ x=x>>1;/*通过计算把1右移到的次数来实现ilog2的函数*/ x=x|x>>1; x=x|x>>2; x=x|x>>4; x=x|x>>8; x=x|x>>16;/*利用或和右移,把1后的所有0变为1*/ intcount=0; intn=0x1|0x1<<8|0x1<<16|0X1<<24; count+=x&n; count+=x>>1&n; count+=x>>2&n; count+=x>>3&n; count+=x>>4&n; count+=x>>5&n; count+=x>>6&n; count+=x>>7&n; return(count&0xf)+(count>>8&0xf)+(count>>16&0xf)+(count>>24&0xf); /*即BitCount函数*/ } */ 本题与bitcout的方法相似,也为二分法。 bitsNumber=(! ! (x>>16))<<4即x向右移16位后若若大于0即得到(10000)2=16,否则得到0。 这是判断最高位是否不为0,若不为0则包含2的16次方。 即得到最高位的log数。 同理bitsNumber=bitsNumber+((! ! (x>>(bitsNumber+8)))<<3); bitsNumber=bitsNumber+((! ! (x>>(bitsNumber+4)))<<2); bitsNumber=bitsNumber+((! ! (x>>(bitsNumber+2)))<<1);bitsNumber=bitsNumber+(! ! (x>>(bitsNumber+1))); 为判断从高到底各位的log情况,这个方法将每位分开求log并相加。 bitsNumber=bitsNumber+(! ! bitsNumber)+(~0)+(! (1^x)); 这一句是当x为零时,还需要减去1才能得到正确的数值。 unsignedfloat_neg(unsigneduf){unsignedresult; unsignedtmp; tmp=uf&(0x7fffffff);result=uf^0x80000000; if(tmp>0x7f800000) result=uf; returnresult; } tmp=uf&(0x7fffffff) 为将uf的符号位改为0。 result=uf^0x80000000 即当uf不是NAN,通过加0x80000000来改变符号位。 if(tmp>0x7f800000) result=uf; 0x7f800000即无穷大,如果tmp的值比无穷大还大,那就是NAN,则返回uf unsignedfloat_i2f(intx){ unsignedshiftLeft=0; unsignedafterShift,tmp,flag;//定义尾数,进位数 : 0=6e|j esp (ooeoxo==(weoxo$*us」印捋))上夬© : L=6e|j (OOLOXOvQ打Oxo$#! US」巩捋))j! { !
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验 datalabhandout 报告 材料
![提示](https://static.bdocx.com/images/bang_tan.gif)