一种方法是将所有内容转换为仅使用 & ^ 作为操作,以及所有的位向量(代码中为 ~0)。将 1 写成全 1 的位向量,将 0 写成全 0 的位向量。 (或者考虑单个位。)
这里有一个快速翻译的方法。将位 1 和 0 解释为 true 和 false,而不是分别解释为奇数和偶数,如奇数和偶数。然后 exclusive or 是当您添加整数时奇数/偶数发生的情况:例如奇数 + 奇数 = 偶数对应于 1^1=0。类似地,and 是整数相乘时奇数/偶数的结果。所以这些运算继承了整数的所有常用代数定律!
因此,将 x^y 写成 x+y,将 x&y 写成 xy,以提醒自己这一点。当奇数/偶数取反时会发生什么,即 x 变为 -x?奇数保持奇数,偶数保持偶数。正如您所发现的,加法和减法是相同的运算。
现在这是一个翻译表。 (最后两个可以使用真值表来检查。)
x^y变成x+y
x&y变成xy
x|y变成x+y+xy
~x变成1+x
让我们把它应用到你的方程式中。
x = a ^ b | ~c & d
= (a ^ b) | ( (~c)& d )
= (a + b) | ( (1+c)d )
= (a + b) + (1+c)d + (a + b)(1 + c)d
现在假设我说 (x,a,b,d) = (1,1,1,1),c 是什么?
1 = (1 + 1) + (1 + c)1 + (1 + 1)(1 + c)1
= 1 - 1 + 1 + c + (1 - 1)(1 + c)
= 1 + c
So subtracting 1, which is the same as adding 1, gives,
0 = c.
现在让我们做我们通常可以做的代数来找到c。
x = (a + b) + (1+c)d + (a + b)(1 + c)d
= (a + b) + d + cd + (a + b)d + (a + b)cd
= (a + b)(1 + d) + d + d(1 + a + b)c
So, adding the parts without c to both sides
(d(1 + a + b))c = x + d + (a + b)(1 + d)
如果左侧 c 的乘数通过某些赋值计算为 0,则 c 可以是任何值,前提是右侧为零。如果在该赋值下右侧不为零,则无解。
如果左边 c 的乘数为 1,则右边是 c 值的公式,因此只有一个解。
什么时候 c 有两个或零个解?当左手乘数为零时。
d(1 + a + b) = 0
这发生在 d=0 或 (1 + a + b)=0 时。最后一个等式等价于a = 1+b,因为1+b = ~b,解是 a≠b。这什么时候会导致两种解决方案?当右侧为零时。
x + d + (a + b)(1 + d) = 0 when d=0 or a = 1 + b
In the first case this evaluates to
x + a + b = 0 which is satisfied by x=a=b=1 or when one of x,a,b is 1.
In the second case this is
x + 1 = 0 which means x = 1
所以有两种解决方案
1. d=0 and ( x=a=b=1 or one of x,a,b is 1 )
or
2. a≠b and x=1
以类似的方式,当有一个解决方案时,当没有解决方案时,可以表征。这里重要的是想法,而不是确切的细节。
就像代数中的其他地方一样,有些情况会比其他情况更容易处理。求助于真值表的蛮力会使每种情况都变得非常棘手,而且常常难以理解,而且当存在潜在的简单事物时,它们可能会变得难以发现。
用 & | 做代数~(布尔代数)要难得多,因为取消事物很困难。除了常量出现在表达式中时的取消之外,取消仅使用吸收定律 a&(a|b)=a 和 a|(a&b)=a 发生,它们是相当复杂的模式,可以引导表达式使用布尔代数的其他规则。