如何使用AND OR NOT和XOR确定是否发生溢出?

时间:2011-01-26 14:51:55

标签: overflow bits logical-operators

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

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

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

3 个答案:

答案 0 :(得分: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:我认为总和在另一个变量未假定的另一个变量中可用

答案 1 :(得分:0)

我认为这样可行,不使用循环或移位。但它的丑陋:

if (
(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)))
) {
  // overflow
}

答案 2 :(得分:0)

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

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

我确信你可以看到那里的模式,所以对于有更多位的数字,递归解决方案非常容易。