我目前正在通过Nand2tetris进行大学课程,而且大部分都是直截了当的。但alu可以在一个步骤中进行减法,我绝对不明白这是如何工作的。
opMinus = addition <> notX <> notOut
我在网上找不到任何解释。尝试自己推导出来的最后一步看起来像废话,即使quickcheck说它是正确的:
a - b
a + !b + 1 -- 2s complement
!!(a + !b + 1) -- double negation
!(!a + b) -- apparently this is correct and i have no clue why
最后一步感觉它依赖于类似的东西
!(a+b) == !a + !b + 1
但我没有直觉为什么这样做,所以非常感谢解释。谢谢阅读!
在玩了这个之后我发现了一些:
(a-b)
!!(a-b) | double bitwise not is id
!(!(a-b)+1-1) | +1-1 is id
!(-(a-b)-1) | !(a-b)+1 = -(a-b)
!(-a + b - 1) | distribute the negation
!(!a + 1 + b - 1) | -a = !a+1
!(!a + b)
更直观地而不是代数地观察它的一种方法是考虑按位补码对整个数字线的作用,即对称地翻转它。 !a + b
然后在翻转的环境中添加b
,最后的!
将所有东西翻转回来。在翻转的上下文中将一个单元“向前”(因此,b = 1
)步进在正常上下文中向后退一步,依此类推。
这种“翻转,动作,翻转”有效地将动作从正常工作的方向转向中间,还有原则的其他实例,有时两个参数都被翻转,例如min(a, b) = !max(!a, !b)
。