其他分享
首页 > 其他分享> > DataLab题解

DataLab题解

作者:互联网

CS:APP DataLab题解

Lab简述

​ 使用高度受限的C语言子集实现简单的逻辑、二进制补码和浮点数操作的函数。

Notes

整数部分

要求

题目

bitXor
题目描述

​ 计算两个数的异或x ^ y

题目限制
思路

​ 从异或的真值表直接凑出来就行

解法
int bitXor(int x, int y) {
    return ~(x & y) & ~(~x & ~y);
}
tmin
题目描述

​ 返回最小的补码数值

题目限制
思路

​ 最小补码值的表示为1000...00,直接将1左移适当位数即可

解法
int tmin(void) {
	return 1 << 31;
}
isTmax
题目描述

​ 判断一个数是不是Tmax(补码最大值),是时返回1,否则返回0

题目限制
思路
解法
int isTmax(int x) {
	return (!~((x | (x + 1)) & (x ^ (x + 1)))) ^ (!(x + 1));
}
allOddBits
题目描述

​ 判断一个数\(x\)所有二进制奇数位是否全为0,是则返回1,否则返回0

题目限制
思路
解法
int allOddBits(int x) {
	return !((x & (x >> 8) & (x >> 16) & (x >> 24) & 0xAA) ^ 0xAA);
}
negate
题目描述

​ 计算\(-x\)

题目限制
思路

​ 这道题书上推导过,有-x = ~x+1

解法
int negate(int x) {
	return ~x + 1;
}
isAsciiDigit
题目描述

​ 判断一个数是不是ASCII的'0'-'9',即是否满足\(0x30 \le x\le 0x39\)

题目限制
思路
解法
int isAsciiDigit(int x) {
	return !(((x + 6) & 0xF0) ^ 0x30) & !(((x + 16) & 0xF0) ^ 0x40);
}
conditional
题目描述

​ 实现x ? y : z

题目限制
思路
解法
int conditional(int x, int y, int z) {
	x = ~(!x) + 1;
	z = z & x;
	x = ~(x + 1) + 1;
	y = y & x;
	return y | z;
}
isLessOrEqual
题目描述

​ 判断是否满足\(x \le y\)

题目限制
思路
解法
int isLessOrEqual(int x, int y) {
	int k1 = ~(((x ^ y) >> 31) & (x >> 31)) + 1;//x < 0 && y >= 0
	int k2 = !((x ^ y) >> 31) & ~((~x + y + 1) >> 31);//xy > 0 && y - x >= 0
	return k1 | k2;
}
logicalNeg
题目描述

​ 不使用!下实现!

题目限制
思路
解法
int logicalNeg(int x) {
	return ~((x | (~x + 1)) >> 31) & 1;
}
howManyBits
题目描述

​ 返回一个二进制数\(x\)的补码编码至少需要的二进制位数

题目限制
思路
解法
int howManyBits(int x) {
	int ans = 0;
 	ans += (!!(x >> 15 ^ (x >> 15 >> 1))) << 4;
 	ans += (!!(x >> (7 + ans) ^ (x >> (7 + ans) >> 1))) << 3;
 	ans += (!!(x >> (3 + ans) ^ (x >> (3 + ans) >> 1))) << 2;
 	ans	+= (!!(x >> (1 + ans) ^ (x >> (1 + ans) >> 1))) << 1;
 	ans += (!!(x >> (ans) ^ (x >> (ans) >> 1)));
 	return ans + 1;
}

浮点数部分

要求

题目

floatScale2
题目描述

​ 输入一个浮点数\(uf\),返回\(uf*2\)的浮点表示

题目限制
思路
解法
unsigned floatScale2(unsigned uf) {
	int maske = 0x7f800000,maskf = 0x7fffff;
	if((maske & uf) == maske){//inf or NaN
		return uf;
	}
	if((maske & uf) == 0){
		int f = maskf & uf;
		if(f & 0x400000){
			f = f * 2 - 0x800000;
			uf |= 0x800000;
		}
		else f <<= 1;
		uf = (uf & 0xff800000) | f;
		return uf;
	}
	else{
		uf += 0x800000;
		return uf;
	}
}
floatFloat2Int
题目描述

​ 输入一个浮点数\(uf\)的位表示,返回(int)uf

题目限制
思路
解法
int floatFloat2Int(unsigned uf) {
	int maske = 0x7f800000,maskf = 0x7fffff,s = uf >> 31;
	if(( maske & uf ) == maske) return 0x80000000u;
	if(( maske & uf ) == 0) return 0;
	int f = ( uf & maskf ) + 0x800000;
	int bias = (1 << (8-1)) - 1;
	int e = ((maske & uf) >> 23) - bias;
	if(e > 31) return 0x80000000u;
	int v = f;
	if(e - 23 >= 0) v <<= e-23;
	else if(23-e < 32) v >>= 23-e;
	else v = 0;
	if(s) v = -v;
	return v;
}
floatPower2
题目描述

​ 输入整数\(x\),返回\(2.0^x\)的浮点表示

题目限制
思路
解法
unsigned floatPower2(int x) {
    if(x < -149) return 0;
	if(x > 128) return 0x7f800000;
	if(x < -126){
		int k = -126 - x;
		return 1 << (23 - k);
	}
	unsigned e = x + 127;
	return e << 23;
}

标签:DataLab,题目,int,题解,操作符,使用,return,uf
来源: https://www.cnblogs.com/02Irving11/p/15864015.html