如何在JAVA中实现XOR Logic

时间:2015-04-10 07:28:47

标签: java

伙计们...接近我之前提出的问题。因此,在XOR Gate逻辑电路中,如果all输入信号为01,则输出为0;如果输入的信号是混合的,例如1110001111,则输出为1;但如果我们有信号0X(未知信号),则输出为x;在1X时,输出应为X。我在方法代码中有一个错误,因为当我们在门中输入1111100001信号时,我得到0而不是1。请问smb请帮帮我?如果输入为000000011111,我该如何处理?注意:Signal.HI1Signal.LO0Signal.XX。如果需要更多信息,请告诉我。

   @Override
    public boolean propagate() 
    {
        Signal inputSignal;
        Signal tempSignal;
        Signal temp = getOutput().getSignal();
        List<Wire> inputs = getInputs();
        Signal result = Signal.LO;

        for(int i = 1; i < inputs.size(); i++)
        {

            inputSignal = inputs.get(i).getSignal();
            tempSignal = inputs.get(0).getSignal();

            if(inputSignal == tempSignal)
                getOutput().setSignal(result);

            /*else if((inputSignal == Signal.LO) && (tempSignal == Signal.LO))
                getOutput().setSignal(result);*/

            else if(inputSignal == Signal.X)
            {
                result = inputSignal;
                getOutput().setSignal(result);
                break;
            }
            else            
                getOutput().setSignal(Signal.HI);
.............................................

2 个答案:

答案 0 :(得分:0)

检查你的循环&#39;。您为扫描的每个数字提供输出。但是我从你的问题细节得到的结果是,在扫描所有信号之后你需要一个输出。

Signal result = Signal.LO;
tempSignal = inputs.get(0).getSignal();

    for(int i = 1; i < inputs.size(); i++)
    {

        inputSignal = inputs.get(i).getSignal();


        if(inputSignal != tempSignal)
        {
              result = Signal.HI;
              break;
        }

        else if(inputSignal == Signal.X)
        {
            result = inputSignal;
            break;
        }
   }
getOutput().setSignal(result);

答案 1 :(得分:0)

你应该系统化逻辑。我会像这样制定解决方案:
 有一个Signal列表作为输入。您必须检查每个Signal的值并构建到目前为止已处理Signal摘要(中间结果)。
在所有情况下,过程必须到达输入的末尾,但是当已经有一个(或多个)HI和一个(或多个)LO时。仅在这种情况下,我们知道输出 只需3个boolean值即可轻松设计摘要,其中包含哪种Signal已被处理。

我保留了您提供的不同类方法,但对于Signal,我定义了一个enum这似乎是一个很好的案例并允许使用switch/case

enum Signal {
    LO(0), HI(1), X(-1);

    private int value;

    private Signal(int i) {
        this.value = i;
    }
    public int getValue() { return value; }
}

propagate()方法可以是:

public boolean propagate() {
    // Summary
    boolean lo = false;
    boolean hi = false;
    boolean x = false;

    Iterator<Wire> iw = getInputs().iterator();
    // loop on wires. Stop if there is a LO and a HI
    while (iw.hasNext() && !(lo && hi)) {
        final Wire w = iw.next();
        switch (w.getSignal()) {
        case HI:
            hi = true;
            break;
        case LO:
            lo = true;
            break;
        case X:
            x = true;
            break;
        }
    }
    // Set the output
    if (hi && lo) {
        getOutput().setSignal(Signal.HI);
    } 
    else if (!lo && hi && x || lo && !hi && x) {
        getOutput().setSignal(Signal.X);
    }
    else {
        getOutput().setSignal(Signal.LO);
    }
    // return true if all wires were checked
    return !iw.hasNext();
}

使用上述方法,结果如下:

  

[LO,LO,LO] - &gt; LO
  [HI,HI,HI] - &gt; LO
  [LO,HI,HI] - &gt; HI
  [HI,X,HI] - &gt; X
  [LO,LO,X] - &gt; X
  [X,X,X] - &gt; LO