《2023年计组实验datalabhandout实验报告.docx》由会员分享,可在线阅读,更多相关《2023年计组实验datalabhandout实验报告.docx(5页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、计算机组成实验实验1:实验题目:dalalab -handou t实验目的:根据b its. c中的规定补全其中的函数,并根据README中的规定在linux 环境下检测函数是否符合规定。实验环境:Ubuntu”. 04 x86系统in t tmp_mask 1 = (0 x 5 5) I (0 x 558);i n t mask 1=( t mp_mas k 1 ) (tmp_maskl 1 6);int tmp_mask2= ( 0x33) | ( 0 x 338);in t m a s k2= (tmp_ma s k2) | (tm p _ma s k2! 6 );i n t t mp
2、mas k 3=(0x0f) | (0x0f8);int ma s k 3 =(tmp_mas k 3) | (tm p _ma s k316);int mas k4= (Oxff) | (0xff16);int mask5=(0xff) | ( 0 xff 1) &m a ski);re s ult=(result&mask2) +( (result 2 )&mask 2 );r es u 1 t = (re s u lt+ (r e s u lt4) ) & ma s k3;r e sult=(res u lt+(r e sul t 8) &ma s k4; result= (r e s
3、u 1 t+(resu 1 t16)&mask 5 ;re t urn re s u 1 t ;)本题采用二分法,先计算x每两位中1的个数,并用相应的两位来储存这个个数。然后 计算每四位1的个数,再用相应的四位进行储存。依次类推,最后整合得到1 6位中1 的个数,即为x中1的个数并输出。i nt ba n g(i n t x ) return ( (x (x+l)31) & 1;)(x|(x+l)即当X为0时,结果为(000)2(3 1个0)。其余情况最首位均为1。因此 右移31位后再取反只有x=0时最后一位为1。再&1取最后一位。因此当x = 0时得到 1,其余情况得到0。i n t t m
4、in( v oid) r etu r n 1 3 1 ;13 1即(1 0 00)z(3 1个0)。其中1是符号位。即为负零,以表达最小的整数。int fits B its(int x, int n) int shi f tNum b e r =n+3 3 ;r eturn ! (x (xsh i ftNumber)sh i ftNumber);)s hiftNumb e r=n+ 3 3 即为T-n + 33= 3 2 n, ( (xs h i ftNum b er) s h i f t Nu mb er)即先左移3 2-n位,再右移32-n位,即保存最后n位数。在与x按位异或并 逻辑取反,
5、若两者两同即x可被表达为一个n位整数,结果为! 0,即返回为1。两者不 同则不可表达为n位整数,结果为!(一个非零数),返回0。in t di v pw r 2 (int x , int n )i nt s i gn x =x31;int mas k = (1 n ;signx=x31 为取 x 的符号位,mask= (1 n)+ (0)即mask 等于 2n M bias=sign x&m a s k 即当 x 为正数,si g nx= 0 , b ia s 为 0, x 为负数,s i gnx=ll, bia s =m as k o (x+bi a s ) n当x为正数即xn,得到结果符合
6、规定。当x为负数时,需要 加上偏置量2皿得到预期结果,因此加上sign x,得到结果符合规定。i n t n ega t e (int x )r eturn x+1;)x+1即-1-x+1=X。得到结果对的。int is P o sit ive(i n t x) r e tu r n ! (x 3 1) | (! x );/re t urn (x31)&! x)(x31)即取x的符号位,!x为逻辑取反,当x = 0时! x=l,其他情况均为0. (x 31) |(! x)即当x=0时得到1, x为负数得到l,x为正数得到0。再进行逻辑取 反,即当x为正数时返回1 , x为0或负数时返回0oi
7、nt isLessOrE q ual (int x , in t y) int sig nx = x3 1 ;判断符号int s igny=y3 1 ;in t signSam e = (x+(y) ) 31) | (! (signxsi g n y ) );/判断是否小于等于i nt signD i ffe r =signx&(! si g ny);r e t u rn si g n D i f fer | signSame;i n t sx=! (x3 1 ) ;/ /判断符号int s y= ! ! ( y 31);int z = y+(x+l);/y-xint s= ! (z 3 1)
8、;ret u r n ( ! (sx 人 s y)&s) | (s x sy)&sx);/* in t d i fferen c e=(x+l)+y; /*yx*/r e turn ( (x&y ) | (x& diff erence) I (y&diff e r e n ce) ) 31&0 x 1; /*通过x, y , diff e r ence的卡诺图求解*/*/补码=反码+1前两步取x、y的符号位,第三步中(x+ (y)3 1为当x-y-1为负数时取1 , ! (signx-signy)为两者相同时取1,两者相或即x = y时s i gnSame为1,第四步即当 x 0时s ignD
9、iffer为1。最后一步即当x0时必返回1,其余情况则x 16) ) 4 ;bitsNumber= b its Number+ (! (x (b i t s N u mb e r+ 8 ) 3);bitsNu m b er=bitsN u mber+(! (x(bit s N u mb e r +4) (b i t sNu mber+2) 1 );bit s Numbe r =bi t sN u mb e r+(! (x (bitsNumbe 147 r +1); bits Numbe r =b its Numb e r + (! bi tsNumbe r ) + ( 0 ) + (!(lx)
10、; r e turn b itsNumb e r;/* i n t i 1 o g2(int x )jx = x1 ;/*通过计算把 1 右移到的次数来实现i log2的函数文/x= X | X 1 ;x=x| x 2 ;x= x | x 4;x = x I x 8 ;x=x| x 1 6;/*运用或和右移,把1后的所有0变为1*/,i n t c o unt=0 ;int n=0xl I 0xl l&n; j c o unt+=x2& n ;c o u n t+ = x3&n;jcount + = x4&n; j count+=x5&n;count += x 6& n ;count+= x
11、7 &n;ret u rn ( c ou n t &0xf)+ (count8& 0 xf) + (co u nt16& 0 x f ) + ( c ount24 &0xf) ; / * 即BitCo u n t 函数 */*/本题与bitcout的方法相似,也为二分法。bi t sNumber=(!(xl 6 ) )。4即x向右移1 6位后若若大于0即得到(1 0 00 0% = 16,否则得到0。这是判断最高位是否不为0,若不为0则包含2的16次方。即得 到最高位的1 o g数。同理 bitsNum b e r = b itsNumber+ (! (x(bi t sNumber+8) (b
12、i t s Number+2) 0x7f 8 00000)resu 1 t =uf;ret u rn resu 1 t;)tmp = uf& (0x7ff f f f f f)为将uf的符号位改为0。r e su 1 t =u f 人 0 x80 0 0 0000即当u f不是NAN,通过加0 x 80 0 0 0 000来改变符号位。i f (tmp0x7f8 0 00 0 0)res ult=uf;Ox 7 f8 0 00 0 0即无穷大,假如imp的值比无穷大还大,那就是NAN,则返回u f。unsigned f lo a t_i 2 f (int x) uns igned s h if
13、t L eft=0;un s i g n e d afterShift, t mp, fl a g; /定义尾数,进位数unsigned absX= x;/ /unsigned sign= 0 ;i f (x=0) r eturn 0;i f (x0)(s ign=0x80000 0 00;ab s X 二一x;)a f te r S h ift=a b s X;while (1)(t mp=af t e rSh ift;a f t e r S h i f t 0 xOlOO)f 1 a g = 1 ;el s e if (af t e r Shift & 0x03f f) =0x0300)f
14、 1 a g= 1 ;elseflag=0;r e turn sign + (after S h ift9) + (15 9-shif t Left) 23) + fl a g;)本题没有理解,都是用的网上的代码。u n s i g nod floa t _twi c e( u n s i gncd u f) u n s igned f= u f ;i f (f & 0x7F8 00 0 00) = 0) f = (f & 0x0 0 7FFFFF) 1) | (0x8000000 0 & f); el s e i f (f & 0x7F8 0 0000) ! = 0 x7F 8 0 00 0
15、 0) f =f+0x 0 080 0 0 0 0;r eturn f;)第一个if语句判断非规格化的数。其中(f& 0 x0 0 7 FFFFF)。作用为令符号位和阶码 被屏蔽,令尾数左移。(0 x8 0 000000 & f)是将符号位恢复。第二个else i f语句判断即为规格化数。f= f +0x00800000即若是规格化数,对它的 阶码加1。假如都不满足的话最后会返回uf本来的值。实验结果及分析:sunlightubuntu: File Edit View Search Terminal Help sunlightubuntu:$ ./die bits.c /usr/include
16、/stdc-predef.h:l: Warning: Non-includable file included from includable file /usr/tnclude/stdc-predef.h.Compilation Successful (1 warning)sunltghtubuntu:$ ./die -e bits.c/usr/tnclude/stdc-predef.h:1: Warntng: Non-includable file included from includable file /usr/include/stdc-predef.h.die:bits.c:142
17、:bitAnd: 4 operatorsdlc:btts.c:154:getByte: 3 operatorsdie:bits.c:166:logicalShift: 6 operatorsdie:bits.c:201:bitCount: 33 operatorsdie:bits.c:211:bang: 6 operatorsdlc:btts.c:220:tmtn: 1 operatorsdie:bits.c:233:fitsBits: 6 operatorsdie:bits.c:249:divpwr2: 7 operatorsdie:bits.c:259:negate: 2 operator
18、sdie:bits.c:269:isPositive: 4 operatorsdie:bits.c:283:isLessOrEqual: 11 operatorsdlc:btts.c:303:tl.og2: 35 operatorsdie:bits.c:323:float_neg: 3 operatorsdie:bits.c:363:float_i2f: 16 operatorsdie:bits.c:388:float_twtce: 9 operatorsCompilation Successful (1 warning)sunlightubuntu:$根据检测可知,编译通过,并且具体操作步数
19、均低于上限。符合规定。实验内容及操作环节:in t bitAnd(in t x, int y) r e t u rn( (x) | ( y );)运用了德摩定律,(x)| (y) ) = C (x)& ( (y) =x&yoint g e tBy t e(int x, int n) return (x(n3)&25 5 ;)要从x中提取一个字节,而字节编号为03。一个字节为8位2进制。n3即为n*8位。x(n Vv3)即为x只保存下除去最后n* *8位剩下的部分。再&2 5 5则只保 存剩下的最右一个字节。得出的结果便为编号指定要提取的那个字节。int logi cal Shift (int x, in t n) int mask = ( 1 n) n);)( (1n)l)即为 2 3 2-n-l,也就是 mask=(0 0 0011 1 11-1)2 (n 个 0,31- n个1) o再mas k & (xn)即为将x算术右移n位后并上m a sk这个前n位 为0的掩码,使当x为负数时位移补1换为补0。int bitC o u n t (int x) i n t r e s u It;