《深入理解计算机系统》Lab1:Data Lab(二)

第1关:float_neg

任务描述

本关任务:补充函数float_neg(),返回-uf的位级表示。

  • 操作符使用数量限制:10

注意:

  • 本题及以下所有的题目都采用 unsigned int来存放位级表示
  • 所有的浮点类型都为 float
  • 如果输入为 NaN,返回 NaN

测试说明

平台会对你编写的代码进行测试:

测试输入:-111
预期输出:0xffffff91

测试输入:-12345
预期输出:0xffffcfc7

int bitAnd(int x, int y) 
{ 
	return 0;
}

int getByte(int x, int n)
{ 
	return 0;
}

int logicalShift(int x, int n) 
{
	return 0;
}

int bitCount(int x) 
{
	return 0;
}

int bang(int x) 
{
	return 0;
}

int tmin(void) 
{ 
	return 0;
}

int fitsBits(int x, int n) 
{
	return 0;
}

int divpwr2(int x, int n) 
{
	return 0;
}

int negate(int x) 
{
	return 0;
}

int isPositive(int x) 
{
	return 0;
}

int isLessOrEqual(int x, int y) 
{
	return 0;
}

int ilog2(int x) 
{
	return 0;
}

unsigned float_neg(unsigned uf)
{
	/********* Begin *********/
	unsigned r=uf;
	unsigned t;//符号取反
	r = r^0x80000000 ;
	t = (uf>>23)&0xff;//非数
	if (t == 0xFF && (uf&0x7FFFFF)>0)
	r = uf;
	return r;

	/********* End *********/	
}

unsigned float_i2f(int x) 
{
	return 0;
}

unsigned float_twice(unsigned uf) 
{
	return 0;
}

 第2关:float_i2f

 

任务描述

本关任务:补充函数float_i2f(),实现由 intfloat 的类型转换。

  • 操作符使用数量限制:30

测试说明

平台会对你编写的代码进行测试:

测试输入:3510593
预期输出:0x4a564504

int bitAnd(int x, int y) 
{ 
	return 0;
}

int getByte(int x, int n)
{ 
	return 0;
}

int logicalShift(int x, int n) 
{
	return 0;
}

int bitCount(int x) 
{
	return 0;
}

int bang(int x) 
{
	return 0;
}

int tmin(void) 
{ 
	return 0;
}

int fitsBits(int x, int n) 
{
	return 0;
}

int divpwr2(int x, int n) 
{
	return 0;
}

int negate(int x) 
{
	return 0;
}

int isPositive(int x) 
{
	return 0;
}

int isLessOrEqual(int x, int y) 
{
	return 0;
}

int ilog2(int x) 
{
	return 0;
}

unsigned float_neg(unsigned uf)
{
	return 0;
}

unsigned float_i2f(int x) 
{
	/********* Begin *********/
    unsigned abs = x;
    unsigned s = 0x80000000 & x;
    unsigned tem = 0x40000000;
    unsigned exp_sign = 0;
    unsigned exp = 0;
    unsigned frac;
    unsigned c = 0;
    if (x == 0)
        return x;
    else if (x == 0x80000000)
        return (s + (158 << 23));
    else {
        if (x < 0)
            abs = -x;
        while (1) {
            if (tem & abs)
                break;
            tem = tem >> 1;
            exp_sign = exp_sign + 1;
        }
        frac = (tem - 1) & abs;
        if (31 - 1 - exp_sign > 23) {
            int i = 30 - exp_sign - 23;
            if ((frac << (31 - (i - 1))) == 0x80000000) {
                if ((frac & (1 << i)) != 0)
                    c = 1;
            } else if ((frac & (1 << (i - 1))) != 0)
                c = 1;
            frac = frac >> i;
        } else
            frac = frac << (23 - (31 - exp_sign - 1));
        exp = 157 - exp_sign;
        return (s + (exp << 23) + frac + c);
    }
	/********* End *********/	
}

unsigned float_twice(unsigned uf) 
{
	return 0;
}

 第3关:float_twice

 

任务描述

本关任务:补充函数float_twice(),返回2*f的位级表示。

  • 操作符使用数量限制:30

测试说明

平台会对你编写的代码进行测试:

测试输入:111
预期输出:0xde

int bitAnd(int x, int y) 
{ 
	return 0;
}

int getByte(int x, int n)
{ 
	return 0;
}

int logicalShift(int x, int n) 
{
	return 0;
}

int bitCount(int x) 
{
	return 0;
}

int bang(int x) 
{
	return 0;
}

int tmin(void) 
{ 
	return 0;
}

int fitsBits(int x, int n) 
{
	return 0;
}

int divpwr2(int x, int n) 
{
	return 0;
}

int negate(int x) 
{
	return 0;
}

int isPositive(int x) 
{
	return 0;
}

int isLessOrEqual(int x, int y) 
{
	return 0;
}

int ilog2(int x) 
{
	return 0;
}

unsigned float_neg(unsigned uf)
{
	return 0;
}

unsigned float_i2f(int x) 
{
	return 0;
}

unsigned float_twice(unsigned uf) 
{
	/********* Begin *********/
    unsigned int exp = 0x7f800000 & uf;
    unsigned int frac = 0x007fffff & uf;
    unsigned int s = 0x80000000 & uf;
    if (((~exp) & 0x7f800000) == 0) {
        return uf;
    } else {
        if (exp == 0) {
            if ((0x00400000 & uf) == 0) {
                frac = frac << 1;
            } else {
                exp = 0x00800000;
                frac = frac << 1;
            }
        } else {
            exp = exp + 0x00800000;
            if (((~exp) & 0x7f800000) == 0)
                frac = 0;
        }
        return (exp | frac | s);
    }
	/********* End *********/	
}

 

  • 9
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 好的,这里是您要求的回答: 这个问题涉及到计算机系统的实验课程——深入理解计算机系统(CS:APP)的第一个lab任务,也称为Data Lab。这个任务要求学生使用C语言编写函数来实现不同的位级操作,从而深入理解计算机中数字的存储和运算。 ### 回答2: 在Data Lab的第部分中,我们学习了如何用不超过十六个操作来实现不同的位运算。这些操作包括移位,逻辑运算,比较和掩码等。通过这些操作的实现,我们可以进一步理解底层计算机系统中位运算的实现原理。 在实现这些操作时,我们需要了解底层计算机系统的运算和数据类型。如符号扩展、零扩展和反码等。同时,在编写代码时需要熟练使用位运算的操作符号以及一些基本控制流语句如循环、条件语句等。 除了实现这些基本操作,我们也需要应用这些操作来解决一些实际问题。例如,实现一个函数,将一个十六进制数按位翻转,或是计算一个整数进制表示中1的数量等。 通过Data Lab的学习,我们深入了解了计算机系统中底层的位运算实现原理,并学会了如何用简洁高效的代码实现这些操作。同时,这些操作也常常被用在各种领域的计算机编程中,对于未来的学习与工作都有很大的帮助。 ### 回答3: 在《深入理解计算机系统lab1:data lab)中,我们主要学习了位运算和两个的补码表示。这些知识对于我们了解计算机的原理和编码方式非常重要。 在这个实验中,我们需要完成一些与位运算相关的任务。其中包括: 1. 实现位运算。我们需要用 C 语言实现一些常见的位运算,如与、或、非、异或、左移、右移等。 2. 计算 x 的相反数。 3. 检查 x 是否为零。 4. 判断 x 的符号是否为负数。 5. 计算 x 和 y 的和,但不能使用加法运算。 为了完成这些任务,我们需要对 C 语言数据类型的细节和位运算的机器级实现有一定的了解。例如,我们要了解有符号整数和无符号整数的区别,以及它们在机器上的表示方式。我们还需要理解位运算的计算过程,包括位移的规则、符号扩展和逻辑运算等。 通过这个实验,我们可以更深入地理解计算机的工作原理,学会用底层的方式实现高级的运算,掌握常用的位运算技巧。这对于提高编程的效率和代码的可读性都有很大帮助。同时,这也为后续的计算机科学学习打下了坚实的基础。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值