python二进制加法_Python实现二进制加法器

标签:

这两天看了《编码的奥秘》里面的二进制加法机及其后面的减法功能的实现,就用Python实现了一个类似功能的加法器出来。

先说一下整体的思想。

由于操作数都是二进制,所以计算简单了许多。首先,运算需要逐位操作,两个二进制数相加使用AndGate即可,但是重点在于要区分出来“和”和“进位”,分别使用XorGate和AndGate实现, 这就搞定了半加器。然后,需要考虑右一位的进位,所以需要一个CI(carry in),然后将本位的sum和右一位的carry in再放到一个半加器里面。再然后,要想明白不管是一开始的两个数产生进位,还是由于后来得到了进位输入产生了进位,总之只可能只有一个进位,所以将两个半加器的CO(carry out)通过OrGate得到最终的进位,第二个半加器和就是最终的和。这就搞定了全加器。如下图:

然后需要的就是把八个相同的连在一起就行了:

减法的实现相对稍微复杂一点,因为减法存在借位,所以首要思想是,要以加法取代减法,所以对于a-b,需要将它替换为(a+(11111111-b)+1)-100000000 这样的形式,这样的话11111111-b就不会借位。然后就是如何搞定11111111-b,这需要求b的反码(也叫1的补数),即把1变0,0变1,实现上需要用到反向器,但是考虑到要和加法一起实现,所以需要使用一个XorGate并用一个标志SUB来标示是加法操作还是减法操作,也同样用来在最前面通过CI实现加1和在最后一步舍去最前面的1(具体过程请看书)。主要图示如下:

到此为止,就全部搞定了。

然后我以Python中函数的定义来代替逻辑门的定义,写了如下的加法器:

1 #!/usr/bin/env python

2

3 defAnd(a, b):4 return int(a andb)5

6 defOr(a, b):7 return int(a orb)8

9 defNand(a, b):10 return int(notAnd(a, b))11

12 defXor(a, b):13 returnAnd(Nand(a, b), Or(a, b))14

15 defHalf_adder(a, b):16 s =Xor(a, b)17 co =And(a, b)18 returns, co19

20 defFull_adder(a, b, ci):21 s, co1 =Half_adder(a, b)22 s, co2 =Half_adder(ci, s)23 co =Or(co1, co2)24 returns, co25

26 def Eight_bit_adder(x, y, sub): #sub=0:add, sub=1:subtract

27 y =list(y)28 for i inrange(len(y)):29 y[i] =Xor(sub, y[i])30 ans = [Full_adder(int(x[7]), int(y[7]), sub)]31 for i in range(6, -1, -1):32 ans.insert(0, Full_adder(int(x[i]), int(y[i]), ans[0][1]))33 ans.insert(0, (Xor(sub, ans[0][1]), None))34 for eachBit inans:35 printeachBit[0],36

37 if __name__ == ‘__main__‘:38 print ‘Select an operator and enter two binary numbers to get their sum or diff‘

39 o = raw_input(‘(A)dd / (S)ubtract:‘).strip().lower()[0]40 x = raw_input(‘x:‘)41 y = raw_input(‘y:‘)42 if o == ‘a‘:43 sub =044 elif o == ‘s‘:45 sub = 1

46 Eight_bit_adder(x, y, sub)

同时,实现减法一章最后讲到,如何使用二进制表示有符号数,也让我对计算机内部的世界更加了解。今天就先说到这里吧。

标签:

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值