目录
前言
该实验为《深入了解计算机系统》即CSAPP的第一个实验:DataLab,旨在通过位级运算实现一些功能。本文介绍开始实验前需要进行的准备工作以及每个函数具体的实现方式。
一、前期准备
1.需要在linux系统上运行,因此无论是在电脑上装一个linux系统或是使用虚拟机,设法取得一个linux系统,推荐使用虚拟机。
2.推荐使用Vscode编辑器,功能强大。
3.实验内容下载地址: http://csapp.cs.cmu.edu/3e/labs.html
注意下载其中的handout即可。
二、函数实现
1.bitXor
bitXor - x^y using only ~ and &
* Example: bitXor(4, 5) = 1
* Legal ops: ~ &
* Max ops: 14
* Rating: 1
用 ~ 和 & 实现异或运算。
思路
先将x为0且y为1的位找出:(~x) & y;
再将x为1且y为0的位找出:x & (~y);
最后用或运算 | 相连,但限制使用 | ,因此用~( ~() & ~() )代替。
函数实现
int bitXor(int x, int y) {
return ~(~((~x) & y) & ~(x & (~y)));
//等价于 (~x) & y | x & (~y) |的前者将x为0y为1的位找出,后者将x为1y为0的位找出
}
2.tmin
tmin - return minimum two's complement integer
* Legal ops: ! ~ & ^ | + << >>
* Max ops: 4
* Rating: 1
返回int类型能表示的最小值,即Tmin。
思路
根据补码规则,int的最小值为0x80000000,因此将1左移31位即可。
函数实现
int tmin(void) {
return 1 << 31; //int类型有32位,将1左移31位得到最小值负2的32次方
}
3.isTmax
isTmax - returns 1 if x is the maximum, two's complement number,
* and 0 otherwise
* Legal ops: ! ~ & ^ | +
* Max ops: 10
* Rating: 1
如果x为最大值(Tmax)则返回1,否则返回0 。
思路
不难(doge)发现,x为最大值0x7FFFFFFF时,+1后(0x80000000)再取反(0x7FFFFFFF)得到了它本身,而除此(Tmax)之外这个性质仅对于x=-1(0xFFFFFFFF)成立。因此我们想到,先验证x加1取反后与x异或,x为最大值时返回0x00000000=0,取非得到返回值1。同时验证x不等于-1(0xFFFFFFFF),即验证x+1不等于0:x+1与0异或,x=-1时得到0,取非两次得到0.将两种情况进行与运算即可排除x=-1的情况。
函数实现
int isTmax(int x) {
return !((~(x+1))^x) & (!!((x+1)^0));
}
4.allOddBits
allOddBits - return 1 if all odd-numbered bits in word set to 1
* where bits are numbered from 0 (least significant) to 31 (most significant)
* Examples allOddBits(0xFFFFFFFD) = 0, allOddBits(0xAAAAAAAA) = 1
* Legal ops: ! ~ & ^ | + << >>
* Max ops: 12
* Rating: 2
如果奇数位全为1(0xAAAAAAAA)则返回1,否则返回0 。
思路
先得到奇数位全为1的数(0xAAAAAAAA),再将x与其比较。
若x满足,x与其与运算后仍为本身,与其异或后为0,取反后为1,返回1;
若x不满足,与运算后存在奇数位为0的位置,异或后这些奇数位为1,取反后为0,返回0.
函数实现
int allOddBits(int x) {
int a_8=0xAA;
int a_16=a_8 | (a_8<<8);
int a_32=a_16 | (a_16<<16); // 获得一个三十二位的奇数位全为1的数
return !((x & a_32)^ a_32);
}
5.negate
negate - return -x
* Example: negate(1) = -1.
* Legal ops: ! ~ & ^ | + << >>
* Max ops: 5
* Rating: 2
输出相反数 -x 。
思路
取反再加1即可。