Contents

Csapp_lab

  • WSL2(Ubuntu22.04) + VSCode
1
2
3
4
apt-get update
sudo apt-get install build-essential
sudo apt-get install gcc-multilib
sudo apt-get install gdb
  • 阅读README获得完整信息
  • 按照bits.c文件的注释修改bits.c
  • 使用./dlc bits.c 检查代码是否符合标准, 若符合则无输出. ./dlc -e bits.c查看用了多少操作符
  • 每次修改bits.c后 执行make clean && make btest编译测试工具
  • 执行./btest检查正确性,./btest -f foo可以单独检查某个函数的正确性
  • 运行./driver.pl打分

只使用~和&实现^

1
2
3
4
a ^ b
= (a | b) & (~a | ~b)
= ~(~a & ~b) & (a & b)
= (a & ~b) | (~a & b)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
//1

/*

 * 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));

}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
/*

 * tmin - return minimum two's complement integer

 *   Legal ops: ! ~ & ^ | + << >>

 *   Max ops: 4

 *   Rating: 1

 */

int tmin(void) {

  return 1 << 31;

}

最大值x应该是第一位为0, 其它位都为1, 则x+1 = ~x. 但是由于所有位都为1的-1+1之后进位的0会溢出消失, 所以-1 + 1 = ~(-1)需要特判, 只需特判~x是否为0, 即(!!~x)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
//2

/*

 * isTmax - returns 1 if x is the maximum, two's complement number,

 *     and 0 otherwise

 *   Legal ops: ! ~ & ^ | +

 *   Max ops: 10

 *   Rating: 1

 */

int isTmax(int x) {
  return !((x+1)^(~x))&(!!~x); 
}

返回-x

1
2
3
4
x + (-x) = 0
x + ~x = 0xffffffff(所有位全为1)
x + ~x + 1 = 0
-x = ~x + 1
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
/*

 * negate - return -x

 *   Example: negate(1) = -1.

 *   Legal ops: ! ~ & ^ | + << >>

 *   Max ops: 5

 *   Rating: 2

 */

int negate(int x) {
  return ~x+1;
}