Logikgatter effektiv ausgeben

Fohnbit

Top Contributor
Hallo!

Ich muss n Boolean Werte halten.
Eine Methode soll dann aus diesen das gewünschte Logikgatter ausgeben:
AND
OR
XOR
XNOR

Wie würde man am effektivsten dies machen?

Schon klar:
Alle in eine List geben und eine Schleife über alle Einträge.

Aber könnte man die auch als Bits schreiben in einem int oder long Wert? (Anzahl ist dann natürlich begrenzt)
Und dann die Bits iterieren?
 
Beispiel Input und Output bitte. Oder generell ein kleines Beispiel liefern.
 
Zuletzt bearbeitet:
Hallo!

Beispiel:

Über eine Methode bekomme ich von einer Klasse, die eine Instanz von meiner erstellt:
Java:
protected synchronized void incomingEvent(boolean value, int id){
}

Die Anzahl der zu "haltenden" Bits wird über
Java:
public int bitLogicArraySize;
in meiner Klasse im Contructor übergeben.

Nun weiß ich beim erstellen meiner Klasse das ich n Boolean Werte zum vergleichen habe.

Ich könnte:
Java:
private boolean recalculateArray() {
		boolean result = booleanArrayList.get(0);
		for (int i = 1; i < booleanArrayList.size(); i++) {
			switch (logicGate) {
			case or:
				result = result | booleanArrayList.get(i);
				break;
			case and:
				result = result & booleanArrayList.get(i);
				break;
			case xor:
				result = result ^ booleanArrayList.get(i);
				break;
			case xnor:
				result = result == booleanArrayList.get(i);
				break;
			}
		}
		return result;
	}

BitSet werde ich mir noch anschauen. Danke!
 
BitSet ist für diese Anwendung denk ich nicht so geeignet.
Es gibt zwar einen Mengenvergleich, aber dieser gibt wiederrum ein BitSet zurück.
Außerdem muss ich dann auch immer 2 BitSets im Speicher halten (das alte und neu zum vergleichen)

Oder sehe ich das falsch?

Danke!
 
Java:
private boolean recalculateArray() {
		boolean result = booleanArrayList.get(0);
		for (int i = 1; i < booleanArrayList.size(); i++) {
			switch (logicGate) {
			case or:
				result = result | booleanArrayList.get(i);
				if (result) {
					return true;
				}
				break;
			case and:
				result = result & booleanArrayList.get(i);
				if (!result) {
					return false;
				}
				break;
			case xor:
				result = result ^ booleanArrayList.get(i);
				break;
			case xnor:
				result = result == booleanArrayList.get(i);
				break;
			}
		}
		return result;
	}

Ist dies die schnellst verarbeitung?

xor und xnor macht aber nur mit 2 Werten sinn, oder?
 
BitSet hat den Vorteil, daß es weniger Speicher verbraucht als eine ArrayList<Byte>.
Von der Handhabung her sind sich die beiden ansonsten ähnlich. Ein BitSet hätte auch den Vorteil, dass AND und OR ohne Iteration geprüft werden können. Bei AND müssen alle Bits im BitSet gesetzt sein, was durch die Bedigung bitset.size() == bitset.cardinality() überprüft werden kann, bei OR muss nur ein Bit gesetzt sein, was gleichbedeutend ist mit bitset.cardinality() > 0.
Ich würde übrigens die vier Fälle als separate Objekte abbilden, damit du nicht für jeden Schleifendurchlauf überprüfen musst, welcher Fall vorliegt.
 

Zurück
Oben