我正在尝试仅使用AND OR XOR而不是确定添加由4位组成的2个二进制数是否会溢出。 我知道,例如,像1100 + 0100这样的东西最终会变成1 | 0000.但是如何才能使用这些逻辑运算符来找到它?
我试图在溢出时发生1000,而0000则不发生溢出。这很容易,因为我可以使用带掩码的XOR来清除最后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))
我确信你可以看到那里的模式,所以对于有更多位的数字,递归解决方案非常容易。