1

我试图只使用 AND OR XOR 而不是确定添加 2 个由 4 位组成的二进制数是否会溢出。例如,我知道像 1100 + 0100 这样的东西最终会变成 1 | 0000. 但是我怎样才能只使用这些逻辑运算符找到它呢?

我试图在发生溢出时获得 1000,而在没有发生溢出时获得 0000。这很容易,因为我可以使用带有掩码的 XOR 来清除最后 3 位。

有没有人有解决这个问题的建议?

4

3 回答 3

1

数字是 ABCD 和 EFGH,^ 是 AND,| 是或。

(A^E) | (B^F^(A|E)) | (C^G^(B|F)^(A|E)) | (D^H^(C|G)^(B|F)^(A|E))

我相信您可以在那里看到模式,因此对于具有更多位的数字,递归解决方案非常容易。

于 2011-01-26T15:06:36.400 回答
1

在过去的几天里,我被困在同一个问题上并想出了答案。假设有两个 4 位数字 a、b 和它们的和存储在另一个 4 位数字 s 中,当第一个位跟随时存在溢出

a = 0, b = 0, s = 1
a = 1, b = 1, s = 0

(NOT a) AND (NOT b) AND s 在第一种溢出情况下返回 1 a AND b AND (NOT s) 在第二种情况下返回 1。您可以对它们进行 OR 以获得 1 作为结果的第一位。所以,

((NOT a) AND (NOT b) AND s) OR (a AND b AND (NOT s))

表达式在溢出的情况下返回 1xxx。将上面的表达式与 1000 相加,当有溢出时返回 1000,当没有溢出时返回 0000。所以,最终的答案是:

(((NOT a) AND (NOT b) AND s) OR (a AND b AND (NOT s))) AND 1000

PS:我假设总和在另一个变量中可用,而其他答案没有假设

于 2020-06-04T09:01:24.573 回答
0

我认为这会起作用,不使用循环或移位。但它很丑:

如果 (
(a & 0x8) && (b & 0x8) ||
(((a & 0x8) || (b & 0x8)) && ((a & 0x4) && (b & 0x4))) ||
(((a & 0x8) || (b & 0x8)) && ((a & 0x4) || (b & 0x4)) && ((a & 0x2) && (b & 0x2))) ||
(((a & 0x8) || (b & 0x8)) && ((a & 0x4) || (b & 0x4)) && ((a & 0x2) || (b & 0x2)) && ((a & 0x1) && (b & 0x1)))
) {
  // 溢出
}
于 2011-01-26T15:05:00.817 回答