计组实验2报告_第1页
计组实验2报告_第2页
计组实验2报告_第3页
计组实验2报告_第4页
计组实验2报告_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

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

文档简介

1、课程实验报告 课 程 名 称: 计算机组成与结构 实验项目名称: Datalab 专 业 班 级: 姓 名: 学 号: 指 导 教 师: 赵欢 完 成 时 间: 2016 年 4 月 12 日信息科学与工程学院实验题目:Datalab实验目的:按实验要求完善 bit.c 里的各个函数,实现其功能,并通过 btest 的测试实验环境:联想ThinkPad E545,Ubuntu14(32位)实验内容及操作步骤:第一步: 完善 bits.c 里的各个函数,代码如下:(1).bitAnd 函数,要求如下: /* * bitAnd - x&y using only and | * Exampl

2、e: bitAnd(6, 5) = 4 * Legal ops: | * Max ops: 8 * Rating: 1 */#题目说明:不使用&符号实现两个数的位与运算;#思路 :德摩根定律 (x & y) = (x) |(y) à (x & y) = (x) |(y)#代码:int bitAnd(int x, int y) return (x)|(y);(2).getByte 函数,要求如下:/* * getByte - Extract byte n from word x * Bytes numbered from 0 (LSB) to 3 (MSB) *

3、 Examples: getByte(0x12345678,1) = 0x56 * Legal ops: ! & | + << >> * Max ops: 6 * Rating: 2 */ #题目说明:要求从数X中取出第n个字节#思路:1.首先,将需要保留的字节移到最低位字节(编号为00的字节)上,即右移n 个byte(每个byte有8位),也就是n*8(n<<3)位;2.清除高三位字节的信息而保留最低位字节的信息,即与0xff 进行&运算即可。#代码:int getByte(int x, int n) return x>>(n&

4、lt;<3)& 0xff; (3).logicalShift 函数,要求如下: /* * logicalShift - shift x to the right by n, using a logical shift * Can assume that 0 <= n <= 31 * Examples: logicalShift(0x87654321,4) = 0x08765432 * Legal ops: ! & | + << >> * Max ops: 20 * Rating: 3 */ #题目说明:用算术右移实现逻辑右移功能#思路:

5、 1、逻辑右移,高位补0。 2、不管是正数还是负数亦或是0,算术右移n位后 位与&一个前n位为0,后面的位都为1的数(00001111(n个0),都能把移位后高位的符号变为0(如果原来为0就保持不变);3.获得一个前位为0的数:将(1 <<31)得到0x80000000 ,算术右移n-1位,即(1<<31)>>n)<<1 ; 得到一个前n位为1,后32-n为0的数(11110000(n个1),再按位取反(y<<31)>>n)<<1)得到一个前n位为0,后32-n为1的数(00001111(n个0),再

6、&(x>>n)即可实现逻辑右移;#代码: int logicalShift(int x, int n) int y=1; return (y<<31)>>n)<<1)&(x>>n); (4).bitCount 函数,要求如下: /* * bitCount - returns count of number of 1's in word * Examples: bitCount(5) = 2, bitCount(7) = 3 * Legal ops: ! & | + << >> *

7、 Max ops: 40 * Rating: 4 */#题目说明:返回32位数字串中1的个数;#思路:1.依次检测x 的每一位,ops 会超出所给限操作符数;2.类似,由于bitcount 结果不会超过32,故可以利用一个32 位二进制数3.将每次的检测位数设定为4 位的;4.初始化tmp=0x1111,用来依次检测x>>i 的0,8,16,24 位是否为1;5.利用val 累加分别计算4 个字节上1 的个数,val 的每个字节的值为对应x 每个字节上的1 的个数;6.最后将得到val 四个字节的值相加,即x 四个字节上1 的个数的和,保留最低字节的信息,为最后结果。#代码: in

8、t bitCount(int x) int tmp=(0x01<<8|0x01)<<8|0x01)<<8|0x01)<<8|0x01;int val=tmp&x; /检测x 的0,8,16,24 位是否为1val+=tmp&(x>>1); /检测x 的1,9,17,25 位是否为1val+=tmp&(x>>2); /.val+=tmp&(x>>3);val+=tmp&(x>>4);val+=tmp&(x>>5);val+=tmp&(

9、x>>6);val+=tmp&(x>>7); /检测x 的7,15,23,31 位是否为1val+=(val>>16); /将val 的高16 位加到低16 位上val+=(val>>8); /再将val 的高8 位加到低8 位上return val&0xff; /保留val 的最低byte 信息为最终结果(5).bang 函数,要求如下: /* * bang - Compute !x without using ! * Examples: bang(3) = 0, bang(0) = 1 * Legal ops: & |

10、 + << >> * Max ops: 12 * Rating: 4 */#题目说明:不施用!符号实现!x的功能(即!0=1,!(other number)=1);#思路: 1. 0的相反数仍为0。 2.其他整数的相反数符号位位必然与原数相反(原数和相反数必然符号位是其中1个为0,另一个为1); 3.一个不为0的数原数和相反数相或的结果符号位必然为1; 0原数和相反数相或的结果符号位必然为0;4.将原数和相反数相或的结果的符号位移到最低位取反后 &上0x01就可以返回符号位的反(即相或的结果符号位为0则返回1,否则返回0);5.一个数取相反数的规则跟负数补码规则

11、一样,x +1,按位取反加1即可;#代码:int bang(int x) int tmp = x +1;tmp = x | tmp;tmp = tmp >> 31; return (tmp &0x01);(6).tmin函数,要求如下:/* * tmin - return minimum two's complement integer * Legal ops: ! & | + << >> * Max ops: 4 * Rating: 1 */#题目说明:求补码编码的最小数;#思路:补码编码的公式 :从公式可以可以看出当最高位为1,而

12、其余位为0的时候,获得最小值。 我们要求的是32位的整数,所以最小值为0x80000000简写就是0x01<<31,也就是1左移31位到最高位#代码:int tmin(void) return 0x01<<31;(7). fitsBits函数,要求如下:/* * fitsBits - return 1 if x can be represented as an * n-bit, two's complement integer. * 1 <= n <= 32 * Examples: fitsBits(5,3) = 0, fitsBits(-4,3)

13、= 1 * Legal ops: ! & | + << >> * Max ops: 15 * Rating: 2 */#题目说明:求给定的一个数是否能用n位补码表示;#思路:x的前32-n都为0或1,可以假定第n-1位为符号位,通过先算术左移再算术右移后比较与原数是否有差别;有差别说明不能表示;如果有差别,与原数亦或后不为0,否则为0,再用逻辑非!取将有差别的返回0,无差别的返回1;#代码:int fitsBits(int x, int n) int s=32+(n+1); /*32+(n+1)=32-n*/ return !(x(x<<s)>

14、>s); (8).divpwr2(除法)函数,要求如下:/* * divpwr2 - Compute x/(2n), for 0 <= n <= 30 * Round toward zero * Examples: divpwr2(15,1) = 7, divpwr2(-33,4) = -2 * Legal ops: ! & | + << >> * Max ops: 15 * Rating: 2 */题目说明:将一个数除以(2n),有余数则往靠近0的方向取舍;#思路:*分 x 为负数和非负数两种情况:当x 为非负数时,直接将x 右移n 位即可;

15、当x 为负数时,如果x 移出的位中不全为零,即有余数,则结果为右移n 位后的结果加1;#代码:int divpwr2(int x, int n) int s=!(x>>31); /取x 的符号位的bool 值int t=(1<<n)+0; /t=(1<<n)-1(t=000.000111.111)int lown=t&x; /lown 保存x 的低n 位的值return (x>>n)+(!lown)&s);(9). negate函数,要求如下:/* * negate - return -x * Example: negate(1)

16、 = -1. * Legal ops: ! & | + << >> * Max ops: 5 * Rating: 2 */#题目说明:取一个数的相反数;#思路:一个数的相反数正好就是对其每一位取反后加一,跟负数的补码规则相似,为x+1,无论正负数都适用。#代码:int negate(int x) return x+1;(10). isPositive函数,要求如下:/* * isPositive - return 1 if x > 0, return 0 otherwise * Example: isPositive(-1) = 0. * Legal op

17、s: ! & | + << >> * Max ops: 8 * Rating: 3 */#题目说明:一个数为正数,则返回1,否则返回0;#思路:1.正数的符号位为0,负数的符号位为1,如果是一个非0的数,返回符号位的反即可,0单独考虑;2. 如果一个数x为0,则!x =1 ,!x =0;否则,一个不为0的数!x =0,!x =1;#代码:int isPositive(int x) int s=!(x>>31);/x右移31位,得到符号位,若为正数,s=1 return s&!x; /返回x为正数满足的条件(11). isLessOrEqual

18、函数,要求如下:/* * isLessOrEqual - if x <= y then return 1, else return 0 * Example: isLessOrEqual(4,5) = 1. * Legal ops: ! & | + << >> * Max ops: 24 * Rating: 3 */#题目说明:如果x <= y则返回1,否则返回0;#思路:1. 判断是否有x<=y,即y-x>=0 是否成立,转化成判断y-x 的正负;分为同号和异号两种情况:2.当x 和y 同号时,y-x 不会发生溢出,判断y-x 是否为非负

19、数即可;3.当x 和y 异号时,y-x 可能会发生溢出,其结果一定和y(也就是!x)的符号一致。#代码:int isLessOrEqual(int x, int y) int sx=!(x>>31);/取x的符号位,为bool类型值int sy=!(y>>31);/ 取y的符号位,为bool类型值int z=y+(x+1);/z=y-x,x求反加一得-x(-x绝对值不变)int s=!(z>>31);/ 取z的符号位,为bool类型值 return (!(sxsy)&s)|(sxsy)&sx);/x,y同号;x,y异号(12). ilog2函

20、数,要求如下:/* * ilog2 - return floor(log base 2 of x), where x > 0 * Example: ilog2(16) = 4 * Legal ops: ! & | + << >> * Max ops: 90 * Rating: 4 */#题目说明:求一个数的log2的值;#思路:*即求32 位二进制x 的最高位1 对应的log base 2;*由x>0,ilog 的结果不会超过31,可以想到用5 位二进制来表示;*依次折半累加得出最高位的权,方法如下(设结果ret=ijklm(2)):首先判断x 的高

21、16 位是否全部为0,ret+=24*i,x 相应右移16 位;再判断右移后x 的高8 位是否全部为0,ret+=23*j,x 相应右移8 位;依次累加得出结果ret。#代码:int ilog2(int x) int s,s1,s2,s3,s4,s5;s=!(x>>16); /判断最高位是否在高16 位上s1=s<<4; /s1 的权为24x>>=s1; /x 相应右移s=!(x>>8); /判断最高位是否在高8 位上s2=s<<3; /s1 的权为23x>>=s2; /x 相应右移s=!(x>>4); /.s

22、3=s<<2;x>>=s3;s=!(x>>2);s4=s<<1;x>>=s4;s=!(x>>1);s5=s; /最后一位return s1+s2+s3+s4+s5;/累加得出结果(13). float_neg函数,要求如下:/* * float_neg - Return bit-level equivalent of expression -f for * floating point argument f. * Both the argument and result are passed as unsigned int

23、's, but * they are to be interpreted as the bit-level representations of * single-precision floating point values. * When argument is NaN, return argument. * Legal ops: Any integer/unsigned operations incl. |, &&. also if, while * Max ops: 10 * Rating: 2 */#题目说明:将一个32位int型数解读为单精度浮点型数据f,返

24、回-f;#思路:1.若这个数被解读为特殊值(阶码位全1),则返回原数;若为非特殊值,则直接对符号位(即最高位)取反;2.使用异或操作符。对1求异或,等价于对1求反;对0求异或,等价于保持原数;当需要对一组数中一部分求反,一部分保持原数时,就可以使用异或运算; 3.判断一个浮点数是否为特殊值:截取其阶码位和小数位与阶码位全1,小数位全0(即0x7fffffff)比较,若大于它,则必然为特殊值; 4.截取数据:可以参考getByte,利用与运算&,需要截取的数和1与,需要清零的数和0与,即可保留需要的数据部分#代码:unsigned float_neg(unsigned uf) unsig

25、ned result ,down; down = uf & (0x7fffffff);if(down > 0x7f8fffff)result = uf;elseresult = uf 0x80000000; return result;(14). float_i2f函数,要求如下:/* * float_i2f - Return bit-level equivalent of expression (float) x * Result is returned as unsigned int, but * it is to be interpreted as the bit-leve

26、l representation of a * single-precision floating point values. * Legal ops: Any integer/unsigned operations incl. |, &&. also if, while * Max ops: 30 * Rating: 4 */#思路:这个函数是将一个整形数,转化为浮点数,浮点数的符号只取决于第一位,所以对负数作取绝对值处理之后,所有数都可以按照同一种方法处理;将二进制数左边的零位全部移出,直到移到“1”位为止,移出的位数shiftleft则为32位中前面“0”的个数,因此32

27、-shiftleft代表的就是阶码的原码部分,再加上127的移码就可以得到最终的阶码;移完0之后得到的aftershift这串数,就是小数部分,所以最后将aftershift右移9位,127+32-shiftleft左移23位,最前面加上符号位,即可得到转移后的数字; #代码:unsigned float_i2f(int x) unsigned shiftLeft=0; unsigned afterShift, tmp, flag; unsigned absX=x; unsigned sign=0; /special case if (x=0) return 0; /if x < 0,

28、sign = 1000.,abs_x = -x if (x<0) sign=0x80000000; absX=-x; afterShift=absX; /count shift_left and after_shift while (1) tmp=afterShift; afterShift<<=1; shiftLeft+; if (tmp & 0x80000000) break; if (afterShift & 0x01ff)>0x0100) flag=1; else if (afterShift & 0x03ff)=0x0300) flag

29、=1; else flag=0; return sign + (afterShift>>9) + (159-shiftLeft)<<23) + flag;(14)float_twice函数,要求如下:/* * float_twice - Return bit-level equivalent of expression 2*f for * floating point argument f. * Both the argument and result are passed as unsigned int's, but * they are to be interpreted as the bit-level representation of

温馨提示

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

评论

0/150

提交评论