datalab

#南京航空航天大学《计算机组成原理Ⅱ课程设计》报告

  • 姓名:xx
  • 班级:1617
  • 学号:1617
  • 报告阶段:datalab
  • 完成日期:2019.4.1

##目录

实验内容

1.nuaa_question1

该问题的关键在于,将参数与需要改变的位数联系起来,例如,n=0,0~8位为0x55,以此类推.通过分析机器数可知,相应的字节数左移三位可以得到移动的位数(八倍关系)。将移动的位数与参数联系起来,实现如下:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-B5XXA4Zl-1584672491080)(C:\Users\Lenovo\Desktop\pa实验报告\datalab\1.PNG)]

int nuaa_question1(int n) 
{
  return 0x55<<(n<<3);
}

2.nuaa_question2

该问题同第一题,关键在于将某个字节的机器数抽离出来,通过移位可以实现。通过布尔运算可以实现某个字节的按位取反,实现如下:

int nuaa_question2(int x, int n) {
	
	return x^(0xff <<(n<<3));
}

3.nuaa_question3

该问题中提到某个字节的判断,思路相同,将某个字节抽离出来,判断是否相同,可以运用机器码中原码与补码的关系,如果相同,则相加为0.如何将实数转换成布尔数,通过!!可以将非0整数转换成1,实现如下:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jIGQxWnx-1584672491085)(C:\Users\Lenovo\Desktop\pa实验报告\datalab\3.PNG)]

int nuaa_question3(int x, int y, int n) {
	int xtemp = x&(0xff << (n<<3));
	int ytemp = y&(0xff << (n<<3));
	return !!(xtemp + (~ ytemp + 1));
}

4.nuaa_question4

同理,与固定字节相关,将固定字节抽离出来,其他位转换为1,进行与运算时不会将其他位改变。如何将其他位转换成1,通过与自身进行位运算异或可以实现,实现如下:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xdxjTONi-1584672491087)(C:\Users\Lenovo\Desktop\pa实验报告\datalab\4.PNG)]

int nuaa_question4(int x, int y, int n) {
	int temp = 0xff << (n<<3);
	int ytemp = (y & temp) ^temp;
	return x&(~ytemp);
}

5.nuaa_question5

该问题不允许使用布尔运算!,所以没有办法直接使非0数转换成1,所以,找到0与其他数的不同点,同时将所有非0数通过运算直接变成0,0直接变成1.不同点:0的原码和补码都为0,非0的源码和补码的符号一定不同,通过这一不同点来进行实现,实现如下:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FQjDtaa1-1584672491092)(C:\Users\Lenovo\Desktop\pa实验报告\datalab\5.PNG)]

int nuaa_question5(int x) {
  return (((x>>31)|((~x+1)>>31))+1);
}

6.nuaa_question6

该问题要将浮点数抽离成整数进行运算,所以符号,阶码,尾数利用第一题思想进行抽离,将浮点数分为几种情况,阶码为0,阶码不为0,尾数有进位,和尾数没有进位进行运算。通过测试可知,有进位的情况等于尾数向右移1位,没有进位是向左移1位。实现如下:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7GuUzLNk-1584672491094)(C:\Users\Lenovo\Desktop\pa实验报告\datalab\6.PNG)]

unsigned nuaa_question6(unsigned uf) {
	unsigned sign = 0x80000000 &uf;
	unsigned sq = 0x7f800000 &uf;
	unsigned number= 0x007fffff &uf;
	if(!uf||uf==0x80000000||sq+number==0x7FC0000)
	{
		return uf;
	}
	if(!sq){
		number<<=1;
	}
	else if(sq^0x7f800000)
	{
		sq+=0x00800000;
		if(!(sq ^0x7f800000))
			number=0;
	}
	return sign+sq+number;
	
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vkGVilVO-1584672491097)(C:\Users\Lenovo\Desktop\pa实验报告\datalab\btest.PNG)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ePtawPJ9-1584672491102)(C:\Users\Lenovo\Desktop\pa实验报告\datalab\driver.PNG)]

遇到的问题及解决方案

1.第一题使用的运算符过多

解决方案:第一题使用运算符时,我将0,1,3,三种情况单独分开计算,使用0x1与参数之间的关系进行移位,导致使用量过多,无法通过。后仔细进行计算,通过直接将参数的机器数进行移位,简单实现。

2.无法将非零数转化成1

解决方案:开始的时候关注方向在如何将0和非零数区分开,后发现进行区分后要将非0整数计算成为整数1.通过0的原码与补码特殊性,进行拼拼凑凑实现了。

实验心得

通过进行位运算在实验中实现相关的操作,例如加减乘除等,帮助我更加深层次的对机器数的操作的理解,对位运算有了新的认识。有利于对程序的优化,帮助我们在程序的编写中能够避免溢出等问题造成的损失。

备注


中实现相关的操作,例如加减乘除等,帮助我更加深层次的对机器数的操作的理解,对位运算有了新的认识。有利于对程序的优化,帮助我们在程序的编写中能够避免溢出等问题造成的损失。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值