python - 在python中实现8位加法器
问题描述
我在python中实现了一个8位加法器,如下所示:
from gates import AND, OR, XOR
from utils import number_to_binary, binary_to_number
def EightBitAdder(s1='110101', s2='00010', carry_in=0):
# Limit to 8 bits
s1 = s1[-8:].zfill(8)
s2 = s2[-8:].zfill(8)
s_out = ''
carry_out = None
for i in range(8):
bit_1 = int(s1[8-1-i])
bit_2 = int(s2[8-1-i])
carry_in = carry_out if (carry_out is not None) else carry_in
value_out = XOR(carry_in, XOR(bit_1, bit_2))
carry_out = OR(AND(bit_1, bit_2), AND(bit_1, carry_in), AND(bit_2, carry_in))
s_out = str(int(value_out)) + s_out
print (" %s (%s) \n+ %s (%s) \n= %s (%s) -- Carry %s" % (s1, binary_to_number(s1), s2, binary_to_number(s2), s_out, binary_to_number(s_out), int(carry_in)))
return (s_out, int(carry_out))
对我来说最引人注目的是“门”会懒惰地评估,所以除非我调用它,否则它不会返回 1/0 int()
,而且 8 位加法器中似乎有大量的门。例如:
我在进位/值输出评估的某个地方(或冗余)犯了错误,还是一个基本的 8 位纹波加法器真的有这么多门?
解决方案
如果直接实现,一个全加器确实有那么多门。您是否考虑过使用复合门,例如 8 位基元或使用半加器?我没有直接的经验,但我不认为在实践中完全加法器是直接用原语实现的,而是他们可能使用这些中间部分。
nand2tetris的第二章介绍了半加器方法,如果您将其应用于您的代码,您可以稍微简化一下:
carry_in = carry_out if (carry_out is not None) else carry_in
value_out = XOR(carry_in, XOR(bit_1, bit_2))
carry_out = OR(AND(bit_1, bit_2), AND(bit_1, carry_in), AND(bit_2, carry_in))
可以改为:
carry_in = carry_out if (carry_out is not None) else carry_in
half_sum = XOR(bit_1, bit_2)
half_carry = AND(bit_1, bit_2)
full_sum = XOR(carry_in, half_sum)
full_carry = AND(half_sum, carry_in)
value_out = full_sum
carry_out = OR(half_carry, full_carry)
这将每次迭代的门数从 6 个减少到 5 个,因此它应该将您的输出减少 1/6。我仍然建议将它放在一个单独的门中,因为半加器是独立有用的。
推荐阅读
- php - Symfony 5 更新后 Laravel 7 电子邮件异常中断
- c# - 更改 IStringLocalizer 的语言
- python - 如何插入小数。Sqlite 表中的 ex(12.5$)
- ios - 如何以编程方式将触摸事件添加到我的 UIView 对象?
- c# - 如何在模型到模型中使用 jquery 发送数据和图像。?
- google-data-studio - Google Datastudio:方面不适用于 vega lite 3.4.0 中的层图
- python - 为什么将数组乘以一个常数会改变数组的大小?
- javascript - 将 Symfony/PHP 应用程序与实时聊天集成
- shell - 如果 find 为空,则不执行下一个命令(xargs --no-run-if-empty)
- c++ - 1 + 1 和给出错误结果的可能性有多大?