我试图只使用 AND OR XOR 而不是确定添加 2 个由 4 位组成的二进制数是否会溢出。例如,我知道像 1100 + 0100 这样的东西最终会变成 1 | 0000. 但是我怎样才能只使用这些逻辑运算符找到它呢?
我试图在发生溢出时获得 1000,而在没有发生溢出时获得 0000。这很容易,因为我可以使用带有掩码的 XOR 来清除最后 3 位。
有没有人有解决这个问题的建议?
我试图只使用 AND OR XOR 而不是确定添加 2 个由 4 位组成的二进制数是否会溢出。例如,我知道像 1100 + 0100 这样的东西最终会变成 1 | 0000. 但是我怎样才能只使用这些逻辑运算符找到它呢?
我试图在发生溢出时获得 1000,而在没有发生溢出时获得 0000。这很容易,因为我可以使用带有掩码的 XOR 来清除最后 3 位。
有没有人有解决这个问题的建议?
数字是 ABCD 和 EFGH,^ 是 AND,| 是或。
(A^E) | (B^F^(A|E)) | (C^G^(B|F)^(A|E)) | (D^H^(C|G)^(B|F)^(A|E))
我相信您可以在那里看到模式,因此对于具有更多位的数字,递归解决方案非常容易。
在过去的几天里,我被困在同一个问题上并想出了答案。假设有两个 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:我假设总和在另一个变量中可用,而其他答案没有假设
我认为这会起作用,不使用循环或移位。但它很丑:
如果 ( (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))) ) { // 溢出 }