使用AND、OR和NOT门实现XNOR门



正如标题所说,我正在尝试使用以下三个门来实现XNOR门:ANDORNOT

我是这样做的:TextBox1.Text = (a And b) Or (Not a And Not b)

当输入a = 10b = 14的预期输出为11时,下面的代码给出了-5的输出。

我正在努力理解我做错了什么——我的XOR门工作正常,XNOR没有。

让我们手工完成这项工作。为了简单起见,我将从";减少的";4位整数。让我们看看我们的初始部分:

a = 10 = 1010
b = 14 = 1110

现在在部分替换完整的表达式:

a AND b 
1010 & 1110 = 1010
Not a = 0101
Not b = 0001
Not a And Not b
0101 & 0001 = 0001

完整的东西:

(a And b) Or (Not a And Not b)
1010 | 0001 = 1011

因此我们得到了1011

这个一开始看起来像一个11,但我们忘记了一些重要的事情:我们没有使用无符号整数。我们需要考虑负值,并回答这是负值还是正值这一重要问题。

对于负值,我们使用本指南中的信息来表示位(简短版本:反转位模式并加1将正数转换为负数,反转过程——先减一——将负数转换为正数(。

结果是,如果它是阳性的,它就是11。但如果它是阴性的,那就是-5。嗯……等一下。这些价值观看起来很熟悉!但哪一个是正确的呢?

为了找出答案,让我们用一个五位整数再试一次。

a = 10 = 01010
b = 14 = 01110

替换完整表达式的部分:

a AND b 
01010 & 01110 = 01010
Not a = 10101
Not b = 10001
Not a And Not b
10101 & 10001 = 10001

完整的东西:

(a And b) Or (Not a And Not b)
01010 | 10001 = 11011

这是一个新的位模式11不再有任何意义(我们将使用27(。然而,作为负值处理,我们仍然得到-5此外,当我们不断向整数添加位时,这些位将始终导致1s在最终的位模式中向左添加。然而,无论我们添加多少位,这种模式仍将始终产生-5,其中原始11将不断变大。最后,这是我前面链接的摘录:

如何确定这个数字是负数。。。如果第一个位是1,则数字为负数。

因为我们有一个前导1,所以这个数字应该被视为负数,这意味着-5是代码的正确结果。

结果是4位值通过有效地溢出我们的整数来隐藏这一点如果必须允许负值,则4位仅为±7。但我想先展示4位版本,展示11/-5的拆分。

最后,让我们看看正确的表达式(再次使用5位整数(:

(a And b) Or (Math.Abs(Not a) And Math.Abs(Not b))
a = 10 = 01010
b = 14 = 01110

替换完整表达式的部分:

a AND b 
01010 & 01110 = 01010
Not a = 10101
Not b = 10001
Math.Abs(Not a) = 01011 ' Subtract 1, invert pattern
Math.Abs(Not b) = 01111
Math.Abs(Not a) And Math.Abs(Not b) 
01011 & 01111 = 01011

完整的东西:

(a And b) Or (Not a And Not b)
01010 | 01011 = 01011

这最终产生了预期的CCD_ 24。

最新更新