📌  相关文章
📜  门| Sudo GATE 2020 Mock II(2019年1月10日)|问题30(1)

📅  最后修改于: 2023-12-03 15:42:19.804000             🧑  作者: Mango

门 | Sudo GATE 2020 Mock II(2019年1月10日)|问题30

简介

该问题考察了程序员对于逻辑门电路的理解与基本操作。逻辑门电路是计算机最基本的组成部分之一,其能够实现对于二进制数据的处理与操作。

背景

在二进制数字的处理过程中,我们会用到若干不同类型的逻辑门电路,如与门、或门、非门等。每种不同类型的门电路有不同的输入输出规则。

题目描述

有两个分别由 16 个逻辑门构成的电路 'A' 和 'B',电路 'A' 和 'B' 的输出都与一个开关配合使用。现在你需要编写一个逻辑门电路,当且仅当 'A' 和 'B' 其中有一个输出为 1 时,你的电路输出为 1 。你的电路只能由 以下四种逻辑门构成:

  • 与门(AND)
  • 或门(OR)
  • 非门(NOT)
  • 异或门(XOR)

请问你需要使用哪些逻辑门电路才能构建出所需的电路。

解题思路
  1. 首先对于逻辑门电路的类型进行分析,由题可知需要达成的条件是:'A' 和 'B' 其中有一个输出为 1 时,你的电路输出为 1 。这时我们需要使用的是 '或门',因此可以直接在电路的输出处使用 '或门'。

  2. 接下来需要考虑的就是将电路 'A' 和电路 'B' 的输出分别链接进来。由于输出皆为0或1,我们可以使用异或门实现相加的功能,而后使用 '与门' 来控制输出的输出为1或0。

  3. 最终的电路图如下所示:

         _____       _____      ____
        |     |     |     |    |     |
        | NOT |--(A)--| XOR |--|     |
 A ---->|_____|     |_____|   | OR  |
                             B---->|_____|--Out
       
代码实现
# 定义逻辑门类
class LogicGate:
    def __init__(self, n):
        self.label = n
        self.output = None

    def getLabel(self):
        return self.label

    def getOutput(self):
        self.output = self.performGateLogic()
        return self.output


# 定义 AndGate 类
class AndGate(LogicGate):
    def __init__(self, n):
        LogicGate.__init__(self, n)

        self.pinA = None
        self.pinB = None

    def getPinA(self):
        if self.pinA == None:
            return int(input("Enter Pin A input for gate " + self.getLabel() + "-->"))
        else:
            return self.pinA.getFrom().getOutput()

    def getPinB(self):
        if self.pinB == None:
            return int(input("Enter Pin B input for gate " + self.getLabel() + "-->"))
        else:
            return self.pinB.getFrom().getOutput()

    def setNextPin(self, source):
        if self.pinA == None:
            self.pinA = source
        elif self.pinB == None:
            self.pinB = source
        else:
            raise RuntimeError("Error: No Empty Pins")


    def performGateLogic(self):
        a = self.getPinA()
        b = self.getPinB()
        if a==1 and b==1:
            return 1
        else:
            return 0


# 定义 OrGate 类
class OrGate(LogicGate):
    def __init__(self, n):
        LogicGate.__init__(self, n)

        self.pinA = None
        self.pinB = None

    def getPinA(self):
        if self.pinA == None:
            return int(input("Enter Pin A input for gate " + self.getLabel() + "-->"))
        else:
            return self.pinA.getFrom().getOutput()

    def getPinB(self):
        if self.pinB == None:
            return int(input("Enter Pin B input for gate " + self.getLabel() + "-->"))
        else:
            return self.pinB.getFrom().getOutput()

    def setNextPin(self, source):
        if self.pinA == None:
            self.pinA = source
        elif self.pinB == None:
            self.pinB = source
        else:
            raise RuntimeError("Error: No Empty Pins")


    def performGateLogic(self):
        a = self.getPinA()
        b = self.getPinB()
        if a==1 or b==1:
            return 1
        else:
            return 0


# 定义 NotGate 类
class NotGate(LogicGate):
    def __init__(self, n):
        LogicGate.__init__(self, n)

        self.pin = None

    def getPin(self):
        if self.pin == None:
            return int(input("Enter Pin input for gate " + self.getLabel() + "-->"))
        else:
            return self.pin.getFrom().getOutput()

    def setNextPin(self, source):
        if self.pin == None:
            self.pin = source
        else:
            raise RuntimeError("Error: No Empty Pins")


    def performGateLogic(self):
        if self.getPin():
            return 0
        else:
            return 1


# 定义XorGate类
class XorGate(LogicGate):
    def __init__(self, n):
        LogicGate.__init__(self, n)

        self.pinA = None
        self.pinB = None

    def getPinA(self):
        if self.pinA == None:
            return int(input("Enter Pin A input for gate " + self.getLabel() + "-->"))
        else:
            return self.pinA.getFrom().getOutput()

    def getPinB(self):
        if self.pinB == None:
            return int(input("Enter Pin B input for gate " + self.getLabel() + "-->"))
        else:
            return self.pinB.getFrom().getOutput()

    def setNextPin(self, source):
        if self.pinA == None:
            self.pinA = source
        elif self.pinB == None:
            self.pinB = source
        else:
            raise RuntimeError("Error: No Empty Pins")


    def performGateLogic(self):
        a = self.getPinA()
        b = self.getPinB()
        if (a==1 and b==0) or (a==0 and b==1):
            return 1
        else:
            return 0


# 定义 NotGate 类
class NotGate(LogicGate):
    def __init__(self, n):
        LogicGate.__init__(self, n)

        self.pin = None

    def getPin(self):
        if self.pin == None:
            return int(input("Enter Pin input for gate " + self.getLabel() + "-->"))
        else:
            return self.pin.getFrom().getOutput()

    def setNextPin(self, source):
        if self.pin == None:
            self.pin = source
        else:
            raise RuntimeError("Error: No Empty Pins")


    def performGateLogic(self):
        if self.getPin():
            return 0
        else:
            return 1


# 定义 BinaryGate 类
class BinaryGate(LogicGate):
    def __init__(self, n):
        LogicGate.__init__(self, n)

        self.pinA = None
        self.pinB = None

    def getPinA(self):
        if self.pinA == None:
            return int(input("Enter Pin A input for gate " + self.getLabel() + "-->"))
        else:
            return self.pinA.getFrom().getOutput()

    def getPinB(self):
        if self.pinB == None:
            return int(input("Enter Pin B input for gate " + self.getLabel() + "-->"))
        else:
            return self.pinB.getFrom().getOutput()

    def setNextPin(self, source):
        if self.pinA == None:
            self.pinA = source
        elif self.pinB == None:
            self.pinB = source
        else:
            raise RuntimeError("Error: No Empty Pins")

# 初始化各逻辑门
g1 = AndGate("G1")
g2 = XorGate("G2")
g3 = NotGate("G3")
g4 = OrGate("G4")

# 连接各逻辑门
g1.setNextPin(g2)
g3.setNextPin(g2)
g2.setNextPin(g4)

# 输出结果
print(g4.getOutput())
参考资料
  1. Python实现逻辑门-博客园
  2. 逻辑门.pdf