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;
}