CSAPP实验——DataLab

本文记录了CSAPP DataLab实验,涉及位操作、整型和浮点型知识,包括bitXor、tmin、isTmax等题目的解题思路和代码实现,通过实验深化理解计算机信息表示。
摘要由CSDN通过智能技术生成

CSAPP — DataLab

CSAPP实验记录

Data Lab

  实验的内容是关于计算机信息的表示,主要包括位操作、整型及浮点型相关知识。


题目列表

名称 任务 难度
bitXor(x, y) 使用~&实现^ 1
tmin() 返回最小补码值 1
isTmax(x) 判断x是否是补码最大值 1
allOddBits(x) 判断所有奇数位是否都为1 2
negate(x) 返回输入的相反数 2
isAsciiDigit(x) 判断x是否是0~9 ASCII 3
conditional(x,y,z) 实现三目运算符x?y:z 3
isLessOrEqual(x,y) 实现<= 3
logicalNeg(x) 实现逻辑非!操作 4
howManyBits(x) x补码表示所需的最小位数 4
float_twice(uf) 计算2*f 4
float_i2f(x) 整型转换为浮点型 4
float_f2i(uf) 浮点型转换为整型 4

题目及思路

bitXor(x, y)

使用取反(~)和与(&)两种位运算实现异或操作(^)。

  • 代码
/* 
 * bitXor - x^y using only ~ and & 
 *   Example: bitXor(4, 5) = 1
 *   Legal ops: ~ &
 *   Max ops: 14
 *   Rating: 1
 */
int bitXor(int x, int y) {
   
  return ~(~x&~y) & ~(x&y);
}
  • 方法
     异或操作 ^ :参与运算的位相同时返回0,不同时返回1。通过 ~& 计算同时为0 ~(~x&~y)和同时为1~(x&y),此时返回0,而不相同时返回1。
tmin()

使用位运算获取补码的最小值 0x80000000-2147483648

  • 代码
/* 
 * tmin - return minimum two's complement integer 
 *   Legal ops: ! ~ & ^ | + << >>
 *   Max ops: 4
 *   Rating: 1
 */
int tmin(void) {
   
  return 0x1<<31;
}
  • 方法
     int数据类型4字节,在X86系统中占32位,补码的最小值为符号位为1,其余全为零,即0x80000000,简单的方法就是对1进行左移操作。
isTmax(int x)

通过位运算判断输入数值是否是补码最大值,即0x7FFFFFFF

  • 代码
/*
 * isTmax - returns 1 if x is the maximum, two's complement number,
 *     and 0 otherwise 
 *   Legal ops: ! ~ & ^ | +
 *   Max ops: 10
 *   Rating: 2
 */
int isTmax(int x) {
   
  return (!(x+1+x+1))&(!!(x+1));
}
  • 方法
     int数据类型的补码最大值是符号位为0,其他位全为1,即0x7FFFFFFF。这里的思路是将Tmax转换为0,同时排除特殊情况。由位运算规则可知,Tmax+1 = tmin,并且Tmax+tmin+1 = 0,特殊情况x = 0xFFFFFFFF时经上述操作时也会为0,但是x=-1时加1为零,可通过这种方法进行排除。
allOddBits(int x)

判断所有奇数位是否都为1

  • 代码
/* 
 * allOddBits - return 1 if all odd-numbered bits in word set to 1
 *   Examples allOddBits(0xFFFFFFFD) = 0, allOddBits(0xAAAAAAAA) = 1
 *   Legal ops: ! ~ & ^ | + << >>
 *   Max ops: 12
 *   Rating: 2
 */
int allOddBits(int x){
   
  return !((x&0xAAAAAAAA)^0xAAAAAAAA);
}
  • 方法
     采用掩码方式解决,构造奇数位全为1的数0xAAAAAAAA,首先通过与& 操作 获取x的奇数位,其他位清零。然后再与0xAAAAAAAA进行异或^ 操作,若相同返回为0,然后返回其逻辑非。
negate(int x)

返回输入的相反数,这里主要考察补码的知识。

  • 代码
/* 
 * negate - return -x 
 *   Example: negate(1) = -1.
 *   Legal ops: ! ~ & ^ | + << >>
 *   Max ops: 5
 *   Rating: 2
 */
int negate(int x) {
   
  return ~x+1;
}
malloclab是CSAPP(Computer Systems: A Programmer's Perspective)教材中的一个实验项目,旨在帮助学生了解内存管理和动态内存分配的细节。 实验的主要任务是实现一个简单的动态内存分配器。这个内存分配器需要提供malloc、free和realloc函数的功能,来动态管理内存。实验中提供了一个基本的代码框架,学生需要在这个框架上完成具体的实现。 整个实验可以分为三个部分:分配器的初始化、分配和释放内存的处理。 在初始化部分,学生需要定义一个初始的堆,为其分配一块内存,并根据实验要求设置好堆的初始状态。 在分配内存的部分,学生需要实现malloc函数。这个函数接收一个参数(需要分配的字节数)并返回指向分配内存的指针。学生需要根据实验要求分配内存,并保证分配的内存块满足对齐和避免碎片化的要求。 在释放内存的部分,学生需要实现free函数。这个函数接收一个参数(指向待释放内存块的指针)并将该内存块标记为可用。学生需要根据实验要求处理不同的情况,比如释放合并相邻的空闲块。 此外,实验还有一些额外的要求,如实现realloc函数,处理内存使用情况的统计等。 通过完成malloclab实验,学生可以深入了解内存管理和动态内存分配的工作原理。这个实验还提供了一个实践机会,让学生亲自动手实现一个简单的内存分配器,从而更好地理解和掌握相关的概念和技术。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值