正如标题所说,我正在尝试使用以下三个门来实现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
,但我们忘记了一些重要的事情:我们没有使用无符号整数。我们需要考虑负值,并回答这是负值还是正值这一重要问题。
对于负值,我们使用本指南中的信息来表示位(简短版本:反转位模式并加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
将不断变大。最后,这是我前面链接的摘录:
如何确定这个数字是负数。。。如果第一个位是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。