CSAPP-sol/labs/datalab/README.md

1.0 KiB

datalab

isTmax

Tmax 的位表示为 011...11。注意到 x + 1 == ~x 当且仅当 x=-1 或 $x=Tmax$。类似的,判断 x + x + 2 == 0 看似也可行,但实际上编译器将这条式子优化成了 x == -1

allOddBits

使用“折半递归法”,参见作业 2.65。

conditional

设计这样一个函数 $f(x)$:当 x=0f(x) = 0x00000000,而 x\neq 0f(x) = 0xFFFFFFFF。此时只需令 conditional(x, y, z) = (y & f(x)) | (z & ~f(x))

一个可行的方案是令 f(x) = !x - 1

isLessOrEqual

核心思路是判断 y - x = y + ~x + 1 的符号位。需要处理一些细节以规避溢出带来的错误。

logicalNeg

“折半递归法”。

howManyBits

对于正数 $x$,所求为最大的 b 使得 x 的第 b-2 位为 1,而对于负数 $x$,则是最大的 b 使得 x 的第 b-2 位为 0。令 x = x ^ (x >> 31),我们得以仅用考虑 x 为正数的情况。有了以上处理与结论,可通过“折半递归法”解决。