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

1 vb.net vb6 bit-manipulation bitwise-operators

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

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

下面的代码给了我一个输出-5,当预期的输出是11输入时a = 10b = 14

我试图了解我做错了什么 - 我的XOR门工作正常,XNOR没有。

Joe*_*orn 5

让我们手动解决这个问题。为简单起见,我将从“简化”的 4 位整数开始。那么让我们看看我们的初始位:

a = 10 = 1010
b = 14 = 1110
Run Code Online (Sandbox Code Playgroud)

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

a AND b 
1010 & 1110 = 1010

Not a = 0101
Not b = 0001

Not a And Not b
0101 & 0001 = 0001
Run Code Online (Sandbox Code Playgroud)

完整的东西:

(a And b) Or (Not a And Not b)

1010 | 0001 = 1011
Run Code Online (Sandbox Code Playgroud)

所以我们得到1011了结果。

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

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

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

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

a = 10 = 01010
b = 14 = 01110
Run Code Online (Sandbox Code Playgroud)

替换完整表达式的部分:

a AND b 
01010 & 01110 = 01010

Not a = 10101
Not b = 10001

Not a And Not b
10101 & 10001 = 10001
Run Code Online (Sandbox Code Playgroud)

完整的东西:

(a And b) Or (Not a And Not b)

01010 | 10001 = 11011
Run Code Online (Sandbox Code Playgroud)

这是一个新的位模式! 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
Run Code Online (Sandbox Code Playgroud)

替换完整表达式的部分:

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
Run Code Online (Sandbox Code Playgroud)

完整的东西:

(a And b) Or (Not a And Not b)

01010 | 01011 = 01011
Run Code Online (Sandbox Code Playgroud)

这最终产生了预期的11.