diff --git a/README.md b/README.md new file mode 100644 index 0000000..a6844fc --- /dev/null +++ b/README.md @@ -0,0 +1,8 @@ +# CS:APP Labs + +最近在啃CSAPP,同时做了些配套的labs,这个项目给了一些labs的解答,都是我参考了Google一点点啃出来的T_T,还有一些是我写的笔记。 +### 目录: +- labs: 包含从[Lab Assignments](http://csapp.cs.cmu.edu/3e/labs.html)下载来的实验文件,其中 bits.c 为题目列表和我写的解答; +- notes: 包含我写的笔记; + + diff --git a/labs/datalab-handout.tar b/labs/datalab-handout.tar deleted file mode 100755 index 9e94552..0000000 Binary files a/labs/datalab-handout.tar and /dev/null differ diff --git a/labs/datalab-handout/bits.c b/labs/datalab-handout/bits.c index 62fd6ac..2196dfe 100755 --- a/labs/datalab-handout/bits.c +++ b/labs/datalab-handout/bits.c @@ -161,11 +161,12 @@ int getByte(int x, int n) { * Rating: 3 */ int logicalShift(int x, int n) { + int mask=((0x1<<(32+~n))+~0)|(0x1<<(32+~n)); + return (x>>n)&mask; /* int c=((0x1<<31>>31)^0x1)<<31; return ((x>>n)^(c>>n)); it's wrong for 0x0>>0x1==0x0 */ -/*Bug: return ~((~x)>>n); it's wrong for ~x contains all 32 bits, - as ~(0x10000000)==(0x0000000001111111) in x86-64? +/*Bug: return ~((~x)>>n); it's wrong for ~x is postive while x is negative */ } /* @@ -212,7 +213,9 @@ int tmin(void) { * Rating: 2 */ int fitsBits(int x, int n) { - return 2; + int c=33+~n; + int t=(x<>c; + return !(x^t); } /* * divpwr2 - Compute x/(2^n), for 0 <= n <= 30 @@ -264,7 +267,7 @@ int isLessOrEqual(int x, int y) { * Rating: 4 */ int ilog2(int x) { - return 2; + return !!(x)+!!(x>>1)+; } /* * float_neg - Return bit-level equivalent of expression -f for diff --git a/labs/datalab-handout/btest b/labs/datalab-handout/btest index 40e0581..023cd77 100755 Binary files a/labs/datalab-handout/btest and b/labs/datalab-handout/btest differ diff --git a/notes/README.md b/notes/README.md new file mode 100644 index 0000000..e69de29