使用 AND、OR 和 NOT 门实现 XNOR 门
Realize XNOR gate using AND, OR and NOT gates
正如标题所说,我正在尝试使用以下三个门来实现一个 XNOR
门:AND
、OR
、NOT
.
我是这样操作的:
TextBox1.Text = (a And b) Or (Not a And Not b)
当输入 a = 10
、b = 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
. 此外,当我们不断地向我们的整数添加位时,这些位总是会导致添加 1
s留在最后的位模式。但是,无论我们添加多少位,这种模式仍将始终产生 -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
。
正如标题所说,我正在尝试使用以下三个门来实现一个 XNOR
门:AND
、OR
、NOT
.
我是这样操作的:
TextBox1.Text = (a And b) Or (Not a And Not b)
当输入 a = 10
、b = 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
. 此外,当我们不断地向我们的整数添加位时,这些位总是会导致添加 1
s留在最后的位模式。但是,无论我们添加多少位,这种模式仍将始终产生 -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
。