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 def And(a, b):
 4     return int(a and b)
 5
 6 def Or(a, b):
 7     return int(a or b)
 8
 9 def Nand(a, b):
10     return int(not And(a, b))
11
12 def Xor(a, b):
13     return And(Nand(a, b), Or(a, b))
14
15 def Half_adder(a, b):
16     s = Xor(a, b)
17     co = And(a, b)
18     return s, co
19
20 def Full_adder(a, b, ci):
21     s, co1 = Half_adder(a, b)
22     s, co2 = Half_adder(ci, s)
23     co = Or(co1, co2)
24     return s, co
25
26 def Eight_bit_adder(x, y, sub): # sub=0:add, sub=1:subtract
27     y = list(y)
28     for i in range(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 in ans:
35         print eachBit[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 = 0
44     elif o == ‘s‘:
45         sub = 1
46     Eight_bit_adder(x, y, sub)

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

时间: 2024-10-07 14:21:04

Python实现二进制加法器的相关文章

符号执行-基于python的二进制分析框架angr

转载:All Right 符号执行概述 在学习这个框架之前首先要知道符号执行.符号执行技术使用符号值代替数字值执行程序,得到的变量的值是由输入变 量的符号值和常量组成的表达式.符号执行技术首先由King在1976年提出 ,经过三十多年的发展,现在仍然被广泛研究,它在软件测试和程序验证中发挥着重 要作用.符号执行是一种重要的形式化方法和静态分析技术,它使用数学和逻辑 首先定义一些基本概念.程序的路径(path)是程序的一个语句序列,这个 语句序列包括程序的一些顺序的代码片段,代码片段之间的连接是由

python socket 二进制

问题 在工作中经常会用到socket传输数据,例如客户端给服务器发送数据(双方约定了数据格式),在交测之前,自己用python写个接受数据的server,解析下拼成的数据格式是否正确.用python写比C语言简单很多. PS:实际上我是不会python的,工作中是C/C++开发,使用python纯属是为了偷懒^_^ 举个具体的例子:通信双方约定的数据格式为           数据格式为二进制的,python需要用到struct模块处理二进制数据.struct模块中最重要的三个函数pack(),

利用Python对二进制数据进行按位处理

最近在用Python做数据包解析,遇到一些要按位处理二进制数据的问题.折腾了一个早上,大概有一点思路,记下来备忘吧. 我要解决的问题是判断一个字节的某几位是否为特定的值,比如判断一个字节的前四位是不是0110. 首先,创建一个文档,里面随便写点东西,保存之后用可以查看二进制数据的软件打开,我用的是notepad++里的HEX-Editor插件. 可以看到字符'a'对应的二进制数据是61(01100001).下面对这个字节的数据进行处理. 首先是打开文件,用read()函数读进去一个字节,用16进

golang和python的二进制转换

1.二进制转换规则 比如13,对13整除2,余数1,整除变为6,依次类推 13/2=6余1 6/2=3余0 3/2=1余1 1/2=0余1 所以最后的结果为1101 2.python def converToBin(n): result = "" while n>0: lsb=n%2 n = n // 2 result=str(lsb)+result return result print(converToBin(5)) print(converToBin(13)) print(

Python Web简单加法器的实现--Python

坚持写博客来记录学习过程,哪怕学习的东西多么简单!下面是python中cgi相关知识. Template.py:(模板引擎文件) #模板引擎def start_response(resp="text/html"): return 'Content-type: '+resp+ '\n\n' def start_form(the_url="",form_type="POST"): return '<form action="'+the

Python基础 二进制和字符编码

二进制定义 二进制是计算技术中广泛采用的一种数制.二进制数据是用0和1两个数码来表示的数.它的基数为2,进位规则是"逢二进一",借位规则是"借一当二",由18世纪德国数理哲学大师莱布尼兹发现.当前的计算机系统使用的基本上是二进制系统,数据在计算机中主要是以补码的形式存储的.计算机中的二进制则是一个非常微小的开关,用"开"来表示1,"关"来表示0. 二进制与十进制转换 我们已经发现,二进制的第n位代表的十进制值都刚好遵循着2的n

一个简单的二进制加法器

先用C++随便声明一个bit结构体: struct bit { unsigned char bit_value; bit(unsigned int value){ if (value == 0 || value == 1) bit_value = (unsigned char)value; else bit_value = 0; } bit() { bit_value = 0; } }; 一位与一位的加法称为半加器,因为不考虑后面的进位加进来: //sumbit表示加法位,carrybit表示进

python读取二进制mnist

training data 数据结构: [offset] [type] [value] [description] 0000 32 bit integer 0x00000803(2051) magic number 0004 32 bit integer 60000 number of images 0008 32 bit integer 28 number of rows 0012 32 bit integer 28 number of columns 0016 unsigned byte ?

Python使用struct处理二进制

有的时候需要用python处理二进制数据,比如,存取文件,socket操作时.这时候,可以使用python的struct模块来完成.可以用 struct来处理c语言中的结构体. struct模块中最重要的三个函数是pack(), unpack(), calcsize() pack(fmt, v1, v2, ...)     按照给定的格式(fmt),把数据封装成字符串(实际上是类似于c结构体的字节流) unpack(fmt, string)       按照给定的格式(fmt)解析字节流stri