Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在JAVA中实现XOR逻辑_Java - Fatal编程技术网

如何在JAVA中实现XOR逻辑

如何在JAVA中实现XOR逻辑,java,Java,伙计们。。。接近我前面的问题。所以,在逻辑电路的异或门中,如果所有的输入信号都是0或1,那么输出是0;如果输入信号为混合信号,如1110001111,则输出为1;但是如果我们有信号0和Xunknown信号,那么输出是x;当1和X时,那么输出应该是X。我在方法代码中有一个错误,因为当11111 00001信号输入到门中时,我得到的是0而不是1。smb能帮我吗?如果输入是0000000或11111,我应该如何处理?注意:Signal.HI是1,Signal.LO是0,Signal.X是X。如果需要更

伙计们。。。接近我前面的问题。所以,在逻辑电路的异或门中,如果所有的输入信号都是0或1,那么输出是0;如果输入信号为混合信号,如1110001111,则输出为1;但是如果我们有信号0和Xunknown信号,那么输出是x;当1和X时,那么输出应该是X。我在方法代码中有一个错误,因为当11111 00001信号输入到门中时,我得到的是0而不是1。smb能帮我吗?如果输入是0000000或11111,我应该如何处理?注意:Signal.HI是1,Signal.LO是0,Signal.X是X。如果需要更多信息,请告诉我

   @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);
.............................................

检查您的“循环”。您正在为扫描的每个数字提供输出。但我从你的问题细节中得到的是,在扫描所有信号之后,你想要一个单一的输出

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);

你应该在逻辑上有条理。我会这样制定解决方案: 有一个作为输入的信号列表。您必须检查每个信号的值,并建立迄今为止已处理的信号的汇总中间结果。 在所有情况下,过程必须到达输入端,但当已经存在一个或多个HI和一个或多个LO时。只有在这种情况下,我们才知道输出。 只需3个布尔值即可轻松设计摘要,这些布尔值保存已处理的信号类型

我保留了您提供的不同类方法,但对于信号,我定义了一个枚举,它似乎是一个很好的案例,并允许使用开关/案例:

传播方法可以类似于:

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]->LO [嗨,嗨,嗨]->LO [LO,HI,HI]>HI [嗨,X,嗨]->X [LO,LO,X]->X [X,X,X]->LO


逻辑很简单。ifinput==输出返回0;否则返回1@尼古拉:为什么你认为你现在的代码应该有效?只是想知道你的思维过程,110应该输出1吗?如果您的描述是准确的,那么它应该是正确的,即使11个输出为0。如果您只有一个X列表,结果应该是LO?
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();
}