From 16b7aea67a3147aae0242c292f7be6f47b2ca5f3 Mon Sep 17 00:00:00 2001 From: "18218461270@163.com" <18218461270@163.com> Date: Thu, 31 Jul 2025 22:20:16 +0800 Subject: [PATCH] update chapter2 homework --- labs/datalab/README.md | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/labs/datalab/README.md b/labs/datalab/README.md index b40614d..bcc817c 100644 --- a/labs/datalab/README.md +++ b/labs/datalab/README.md @@ -2,19 +2,14 @@ ## `isTmax` $Tmax$ 的位表示为 `011...11`。注意到 `x + 1 == ~x` 当且仅当 $x=-1$ 或 $x=Tmax$。类似的,判断 `x + x + 2 == 0` 看似也可行,但实际上编译器将这条式子优化成了 `x == -1`。 -## `allOddBits` +## `allOddBits`、`logicalNeg` 使用“折半递归法”,参见作业 2.65。 ## `conditional` -设计这样一个函数 $f(x)$:当 $x=0$ 时 `f(x) = 0x00000000`,而 $x\neq 0$ 时 `f(x) = 0xFFFFFFFF`。此时只需令 `conditional(x, y, z) = (y & f(x)) | (z & ~f(x))`。 - -一个可行的方案是令 `f(x) = !x - 1`。 +设计函数 `f(x) = ~!x + 1`:当 $x=0$ 时 `f(x) = 0xFFFFFFFF`,而 $x\neq 0$ 时 `f(x) = 0x00000000`。 ## `isLessOrEqual` -核心思路是判断 `y - x = y + ~x + 1` 的符号位。需要处理一些细节以规避溢出带来的错误。 - -## `logicalNeg` -“折半递归法”。 +先判断 $x,y$ 是否异号;接着判断 `y - x`,即 `y + ~x + 1` 的符号位,当 $x,y$ 同号时不会溢出。 ## `howManyBits` -对于正数 $x$,所求为最大的 $b$ 使得 $x$ 的第 $b-2$ 位为 `1`,而对于负数 $x$,则是最大的 $b$ 使得 $x$ 的第 $b-2$ 位为 `0`。令 `x = x ^ (x >> 31)`,我们得以仅用考虑 $x$ 为正数的情况。有了以上处理与结论,可通过“折半递归法”解决。 \ No newline at end of file +为了只考虑 $x$ 为正数的情况,令 `x ^= x >> 31`。接下来可通过“折半递归法”解决。 \ No newline at end of file