CSAPP_datalab 笔记
记录自己在做lab时的思考过程
默认前提
- x 为 32位有符号数(
int) - 右移默认为算术右移
通过位运算获得特殊数
| x 条件 | 运算 | 结果 |
|---|---|---|
x!=0 |
!x |
0 |
x=0 |
!x |
1 |
x<0 |
x>>31 |
-1 |
x>0 |
x>>31 |
0 |
x=1 |
1<<31 |
Tmin |
x!=Tmin |
~x+1 |
-x |
通过位运算实现逻辑控制
与异或运算相关
x ^ -1(111..11b)等同于~xx ^ 0(000..00b)等同于x(不变)x ^ (x >> 31)- x非负则保持不变
- x为负则按位取反
设计掩码
- 要生成从第
x位到x+b位的1掩码111..1 << x(b位1)
通过!和&实现选择逻辑
- 实现
if x == 1, return y else z- y, z均为1位二进制数
(x & y) + (!x & z)
- 实现
if x is true, return y else z-
y, z均为任意二进制
-
记
flag为!x,x为零时为一, 不为零时为零 -
-1=111...1b实际上为全一掩码, 0为全零掩码flag flag - 1 ~flag + 1 0 11111111(b)00000000(b)1 00000000(b)11111111(b) -
(flag - 1) & y + (~flag + 1) & z
-
补码的溢出性质
Tmax和-1都满足(x+1) << 1 == 001...11 -> 10..00-> 00..0011...11 -> 00..00-> 00..00
0和Tmin都满足~x + 1 == x00...00 -> 11...11->00..0010...00 -> 01...11->10..00

浙公网安备 33010602011771号