写在前面:对于想要入门csapp的人最好边看书边做实验,看书的时间不需要太多,主要有个大概的概念就行,通过做实验再慢慢理解,切记做实验的时候别只为了通过系统的测试而且改参数,而应该先分析,然后提取出大致思路后再开始着手改错。
实验环境
我是在windows10下的vscode编辑(因为比较熟悉这款软件),然后在搭建的服务器上测试,利用xshell和xftp工具进行文件传输和指令测试。
为什么不在vmware上呢?因为我感觉我比较菜,解决了这个问题很久,有网络问题,有编译器问题。所以索性就直接用我之前花了10块钱买的服务器来玩。
为什么不在docker虚拟化环境下做呢?因为在这个环境下不能用自己的vscode,而且每次做了一半的实验保存起来有点麻烦,主要我是有一次完成了几个小实验,然后不小心点了关闭窗口,然后。。。。数据就不见了,好像很难找回了,所以我就放弃了,docker虚拟化感觉比较适合在线上服务器中的搭建,而且只适合一次性编程。
实验要求
实验内容
//1
/*
* bitXor - x^y using only ~ and &
* Example: bitXor(4, 5) = 1
* Legal ops: ~ &
* Max ops: 14
* Rating: 1
*/
//思路:求异或的非与表达式。逆方向来求解,异或是不同为一,那我们先求他们相同项,最后取反。
// 把1相同项找出来,再把0相同项找出来,然后分别取反再与起来
int bitXor(int x, int y) {
return ~(x&y)&~(~x&~y);
}
/*
* tmin - return minimum two's complement integer
* Legal ops: ! ~ & ^ | + << >>
* Max ops: 4
* Rating: 1
*/
// 思路:求0xffffffff,利用算术左移会根据符号位进行补位
int tmin(void) {
return 0x1<<31;
}
//2
/*
* isTmax - returns 1 if x is the maximum, two's complement number,
* and 0 otherwise
* Legal ops: ! ~ & ^ | +
* Max ops: 10
* Rating: 1
*/
// 思路:求是否为补码最大值0x7fffffff,利用取反和加一一样的特质,除了最小值一样
int isTmax(int x) {
return !((x+1)^(~x))&!!((x+1));
}
/*
* 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,利用半掩码来算
int allOddBits(int x) {
int i = 0xaa + (0xaa<<8);
i += i<<16;
return !((x&i)^i);
}
/*
* negate - return -x
* Example: negate(1) = -1.
* Legal ops: ! ~ & ^ | + << >>
* Max ops: 5
* Rating: 2
*/
// 思路:如何实现取相反数运算,即如何去补码。
int neg