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

Realize XNOR gate using AND, OR and NOT gates

正如标题所说,我正在尝试使用以下三个门来实现一个 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,但我们忘记了一些重要的事情:我们没有使用无符号整数。我们需要允许负值并回答这个重要问题是负值还是正值。

对于负值,我们使用来自 this guide 的信息表示位(简短版本:反转位模式并加 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 会不断变大。最后,这是我之前的摘录 link:

How you can be sure this number is negative? ... If the first bit is a 1, the number is negative.

因为我们有一个前导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

这最终产生了预期的 11