与或非门——python逻辑电路

与或非门——python逻辑电路简单的逻辑电路通常是由门电路构成 而门电路是用以实现基本逻辑运算和复合逻辑运算的单位电路 为了实现门电路 我们可以依次创建各个门类 而根据其的共性与特性 可以将其组织成继承层次结构

逻辑电路(一)

1.逻辑门(LogicGate)​​​​​​​

2.单输入逻辑门(UnaryGate)

3.双输入逻辑门(BinaryGate)

4.非门(NOTGate)

5.与门(ANDGate)

6.或门(ORGate)

7.异或门(XORGate)

8.连接器(Connector)

9.简单逻辑电路实例(Simple logic circuit example)

10.完整代码(Complete code)

11.参考资料(reference material)​​​​​​​​​​​​​​


简单的逻辑电路通常是由门电路构成,而门电路是用以实现基本逻辑运算和复合逻辑运算的单位电路,常用的门电路在逻辑功能上有非门(NOT Gate)、与门(ANDGate)、与非门(NANDGate)、或门(ORGate)、或非门(NORGate)、异或门(XORGate)。

为了实现门电路,我们可以依次创建各个门类,而根据其的共性与特性,可以将其组织成继承层次结构。

与或非门——python逻辑电路

根据输入数量,可分为单输入逻辑门(UnaryGate)和双输入逻辑门(BinaryGate)。

单、双输入逻辑门又可归类为具有一种逻辑的门即逻辑门(LogicGate)。

1.逻辑门(LogicGate)

为实现其逻辑功能,每个门电路应有输出的值。为获取输出的值,门电路需要根据输入的值进行合理的逻辑运算,即需要一个逻辑运算的方法。但是该方法不必在逻辑门类中实现,因为不同的门电路应有不同的方法。当然,每个门电路都还有一个用于识别的标志(label)。

class LogicGate: """逻辑门""" def __init__(self, n): self.label = n # 识别标志 self.output = None # 输出的值 def label(self): # 获取识别标志的方法 return self.label def getoutput(self): # 获取输出的值的方法 # 将输出值交给一个逻辑运算的方法,等待子类逻辑门实现 self.output = self.donelogic() return self.output

2.单输入逻辑门(UnaryGate)

构造子类时,应继承父类(LogicGate),调用父类的构造方法,同时定义接收输入值的变量pin和接收输入值的方法getpin():

如果输入值为空,则要求主动输入;否则

如果构造类时传入了输出值,则输出值即为传入值;

否则应为上一门电路的输出值。

class UnaryGate(LogicGate): # 继承父类 """单输入逻辑门""" def __init__(self, n, pin=None): super().__init__(n) # 调用父类的构造方法 self.pin = pin # 接收输入的变量pin def getpin(self): if self.pin is None: # 如果输入值为空,则要求主动输入 return eval(input("请输入{}的pin值-->".format(self.label))) else: if self.pin == 1: # 如果构造类时传入了输出值,则输出值即为传入值 return 1 elif self.pin == 0: return 0 else: # 否则应为上一门电路的输出值 return self.pin.getoutput()

同理可以构造双输入逻辑门

3.双输入逻辑门(BinaryGate)

class BinaryGate(LogicGate): """双输入逻辑门""" def __init__(self, n, pinA=None, pinB=None): super().__init__(n) # 调用父类的构造方法 self.pinA = pinA # 接收输入的变量pinA self.pinB = pinB # 接收输入的变量pinB def getpinA(self): if self.pinA is None: # 如果输入值为空,则要求主动输入 return eval(input("请输入{}的pinA值-->".format(self.label))) else: if self.pinA == 1: # 如果构造类时传入了输出值,则输出值即为传入值 return 1 elif self.pinA == 0: return 0 else: # 否则应为上一门电路的输出值 return self.pinA.getoutput() def getpinB(self): if self.pinB is None: # 如果输入值为空,则要求主动输入 return eval(input("请输入{}的pinB值-->".format(self.label))) else: if self.pinB == 1: # 如果构造类时传入了输出值,则输出值即为传入值 return 1 elif self.pinB == 0: return 0 else: # 否则应为上一门电路的输出值 return self.pinB.getoutput()

4.非门(NOTGate)

在此构建具体门类时,实现了实现逻辑功能的方法donelogic,即通过输入值进行逻辑运算得到输出值。

class NOTGate(UnaryGate): """非门""" def __init__(self, n, pin=None): super().__init__(n, pin) def donelogic(self): # 实现 实现逻辑功能的方法 i = self.getpin() # 获取输入值 self.pin = i # 存储输入值 if i == 1: # 逻辑运算 return 0 else: return 1

同理可以构造与门、或门、异或门等

5.与门(ANDGate)

class ANDGate(BinaryGate): """与门""" def __init__(self, n, pinA=None, pinB=None): super().__init__(n, pinA, pinB) def donelogic(self): a = self.getpinA() self.pinA = a b = self.getpinB() self.pinB = b if a == 1 and b == 1: return 1 else: return 0

6.或门(ORGate)

class ORGate(BinaryGate): """或门""" def __init__(self, n, pinA=None, pinB=None): super().__init__(n, pinA, pinB) def donelogic(self): a = self.getpinA() self.pinA = a b = self.getpinB() self.pinB = b if a == 0 and b == 0: return 0 else: return 1

7.异或门(XORGate)

class XORGate(BinaryGate): """异或门""" def __init__(self, n, pinA=None, pinB=None): super().__init__(n, pinA, pinB) def donelogic(self): a = self.getpinA() self.pinA = a b = self.getpinB() self.pinB = b if a == b: return 0 else: return 1

8.连接器(Connector)

然而,在创建了各个门电路类后,要想使用门电路组成逻辑电路,就需要一个连接器类(Connector)将前一门电路(fromgate)与后一门电路(togate)连接起来,从而实现值的传递。而在实现连接器类之前,每个门电路类应该有一个方法setNextpin使得自身的引脚pin接收前一门电路fromgate,从而实现门电路的连接。(以UnaryGate为例)

 def setNextPin(self, source): if self.pin is None: self.pin = source else: print("连接失败:输入已满")

这样就可以创建连接器类。显然,每一个连接器对象包含fromgate和togate两个门电路实例。

class Connector: """连接器""" def __init__(self, fgate, tgate): self.fromgate = fgate # 前一门电路实例 self.togate = tgate # 后一门电路实例 tgate.setNextPin(fgate) # 将前后门电路连接起来 def getfrom(self): return self.fromgate def getto(self): return self.togate

9.简单逻辑电路实例(Simple logic circuit example)

与或非门——python逻辑电路

g1 = ANDGate("g1", 1, 0) g2 = ORGate("g2", 1, 1) g3 = XORGate("g3") g4 = NOTGate("g4") c1 = Connector(g1, g3) c2 = Connector(g2, g3) c3 = Connector(g3, g4) print(g4.getoutput()) # 输出结果为 0

10.完整代码(Complete code)

class LogicGate: """逻辑门""" def __init__(self, n): self.label = n # 识别标志 self.output = None # 输出的值 def label(self): # 获取识别标志的方法 return self.label def getoutput(self): # 获取输出的值的方法 # 将输出值交给一个逻辑运算的方法,等待子类逻辑门实现 self.output = self.donelogic() return self.output class UnaryGate(LogicGate): # 继承父类 """单输入逻辑门""" def __init__(self, n, pin=None): super().__init__(n) # 调用父类的构造方法 self.pin = pin # 接收输入的变量pin def getpin(self): if self.pin is None: # 如果输入值为空,则要求主动输入 return eval(input("请输入{}的pin值-->".format(self.label))) else: if self.pin == 1: # 如果构造类时传入了输出值,则输出值即为传入值 return 1 elif self.pin == 0: return 0 else: # 否则应为上一门电路的输出值 return self.pin.getoutput() def setNextPin(self, source): if self.pin is None: self.pin = source else: print("连接失败:输入已满") class BinaryGate(LogicGate): """双输入逻辑门""" def __init__(self, n, pinA=None, pinB=None): super().__init__(n) # 调用父类的构造方法 self.pinA = pinA # 接收输入的变量pinA self.pinB = pinB # 接收输入的变量pinB def getpinA(self): if self.pinA is None: # 如果输入值为空,则要求主动输入 return eval(input("请输入{}的pinA值-->".format(self.label))) else: if self.pinA == 1: # 如果构造类时传入了输出值,则输出值即为传入值 return 1 elif self.pinA == 0: return 0 else: # 否则应为上一门电路的输出值 return self.pinA.getoutput() def getpinB(self): if self.pinB is None: # 如果输入值为空,则要求主动输入 return eval(input("请输入{}的pinB值-->".format(self.label))) else: if self.pinB == 1: # 如果构造类时传入了输出值,则输出值即为传入值 return 1 elif self.pinB == 0: return 0 else: # 否则应为上一门电路的输出值 return self.pinB.getoutput() def setNextPin(self, source): if self.pinA is None: self.pinA = source else: if self.pinB is None: self.pinB = source else: raise RuntimeError("连接失败:输入已满") class NOTGate(UnaryGate): """非门""" def __init__(self, n, pin=None): super().__init__(n, pin) def donelogic(self): # 实现 实现逻辑功能的方法 i = self.getpin() # 获取输入值 self.pin = i # 存储输入值 if i == 1: # 实现 return 0 else: return 1 class ANDGate(BinaryGate): """与门""" def __init__(self, n, pinA=None, pinB=None): super().__init__(n, pinA, pinB) def donelogic(self): a = self.getpinA() self.pinA = a b = self.getpinB() self.pinB = b if a == 1 and b == 1: return 1 else: return 0 class NANDGate(BinaryGate): """与非门""" def __init__(self, n, pinA=None, pinB=None): super().__init__(n, pinA, pinB) def donelogic(self): a = self.getpinA() self.pinA = a b = self.getpinB() self.pinB = b if a == 1 and b == 1: return 0 else: return 1 class ORGate(BinaryGate): """或门""" def __init__(self, n, pinA=None, pinB=None): super().__init__(n, pinA, pinB) def donelogic(self): a = self.getpinA() self.pinA = a b = self.getpinB() self.pinB = b if a == 0 and b == 0: return 0 else: return 1 class XORGate(BinaryGate): """异或门""" def __init__(self, n, pinA=None, pinB=None): super().__init__(n, pinA, pinB) def donelogic(self): a = self.getpinA() self.pinA = a b = self.getpinB() self.pinB = b if a == b: return 0 else: return 1 class Connector: """连接器""" def __init__(self, fgate, tgate): self.fromgate = fgate # 前一门电路实例 self.togate = tgate # 后一门电路实例 tgate.setNextPin(fgate) def getfrom(self): return self.fromgate def getto(self): return self.togate g1 = ANDGate("g1", 1, 0) g2 = ORGate("g2", 1, 1) g3 = XORGate("g3") g4 = NOTGate("g4") c1 = Connector(g1, g3) c2 = Connector(g2, g3) c3 = Connector(g3, g4) print(g4.getoutput())

11.参考资料(reference material)

https://baike.baidu.com/item/逻辑电路/?fr=aladdin

https://baike.baidu.com/item/逻辑门

https://baike.baidu.com/item/门电路

python数据结构与算法分析(第2版)

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/223351.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 下午2:16
下一篇 2026年3月17日 下午2:17


相关推荐

  • git如何合并远程2个分支

    git如何合并远程2个分支

    2021年10月22日
    97
  • geth访问节点_Geth 命令详解

    geth访问节点_Geth 命令详解本文是 geth 的一篇学习笔记 geth 控制台启动和退出最简单的启动方式如下 gethconsole 启动成功之后可以看到输入提示符 gt 退出 Geth 控制台也很简单 只要输入 exit 即可 geth 日志控制使用 gethconsole 启动是 会在当前的交互界面下时不时出现日志 可以使用以下方式把日志输出到文件 gethconsole2 gt gt geth log 可以新开一个

    2026年3月17日
    2
  • linux menuconfig搜索,linux系统menuconfig解析

    linux menuconfig搜索,linux系统menuconfig解析在对linux进行编译,常用的命令是makemenuconfig,使用图形界面来对整个系统进行裁剪;这里主要就makemenuconfig的执行过程进行解析。介绍跟makemenuconfig这个命令相关的文件,包括三类,包括.config,Kconfig,Makefile。为什么不说三个,而说三类呢?因为Kconfig和Makefile是配合使用的,在很多的子目录都存在,而.config只…

    2022年5月30日
    38
  • 【DGX Spark 实战】部署 vLLM + Open WebUI 运行 Qwen3-Coder-Next-FP8(CUDA 13.0 兼容版)-修订

    【DGX Spark 实战】部署 vLLM + Open WebUI 运行 Qwen3-Coder-Next-FP8(CUDA 13.0 兼容版)-修订

    2026年3月15日
    4
  • 产生随机数算法[通俗易懂]

    产生随机数算法[通俗易懂]两个办法帮你解决如何在Java中产生随机数http://cd.qq.com     随机数在日常的应用和开发中经常会见到,比如说某些系统会为用户生成一个最初的初始化密码,这就是一个随机数。如何生成这个随机数,不同的开发工具的方法也不一样。在应用中,Java是应用最为广泛的开发工具之一,如何在Java中产生随机数,也是很多开发者在初学随机数时的一个必修课,在此为读者贡献两个办法帮你

    2022年7月26日
    8
  • 手机开发平台介绍[通俗易懂]

    手机开发平台介绍[通俗易懂]
    刚刚进入手机研发领域,为今后职业生涯规划,从网上搜了资料方便学习。
    手机客户端软件开发最大的困难就是平台不统一,手机开发平台太多。
    手机可分为智能手机开发和featherphone手机。开发平台可分为开放式平台和封闭式平台,开放式平台包括symbian、windowsmobile、linux、iPhone、Android、BlackBerry、j2me、brew等,支持手机应用程序通过OTA下载和安装;封闭式平台包括MTK、展讯、TI、飞利浦等。下面分别介绍。

    2022年8月12日
    11

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号