# Exklusiv Oder



## Attira (11. Nov 2012)

Ich habe eine Frage zu dem exklusiv Oder in Java.
Das logische exklusiv oder sieht ja nach der Wahrheitstabelle so aus: A^B =

A|B|A^B
0 |0|  0
1 |0|  1
0 |1|  1
1 |1|  0

D.h., dass es nur dann richtig umgesetzt ist, wenn entweder A oder B gilt. Falsch ist es dann, wenn A und B beide gleichzeitig gelten oder beide nicht.
Ist das in Java auch so? Bei mir liefert es nämlich für die Bedingung:
A^B^C auch dann ein richtiges Ergebnis, wenn keines von dreien gilt.


----------



## pro2 (11. Nov 2012)

Das siehst so aus:

0 0 = 0
0 1 = 1
1 0 = 1
1 1 = 0

Und das ist überall der Fall, auch in jeder anderen Sprache.
Syntaxmäßig ist das das 
	
	
	
	





```
^
```
, das ist korrekt.


----------



## Attira (11. Nov 2012)

pro2 hat gesagt.:


> Das siehst so aus:
> 
> 0 0 = 0
> 0 1 = 1
> ...



Sry, hatte zu früh auf den Senden-Button gedrückt.
Ich weiß, dass es so abläuft (in der Logik), aber wie gesagt, liefert es mir in Java auch für den Fall 0 0 = 1.

Edit: für die Bedingung ((A && !B && !C) || (B && !A && !B) || (C && !A && !B) ) liefert es mir aber genau die wahrheitstabelle. Das ist ja auch das exklusiv oder, nur umständlich ausformuliert.


----------



## TKausL (11. Nov 2012)

Attira hat gesagt.:


> Sry, hatte zu früh auf den Senden-Button gedrückt.
> Ich weiß, dass es so abläuft (in der Logik), aber wie gesagt, liefert es mir in Java auch für den Fall 0 0 = 1.



Codebeispiel?


----------



## Gast2 (11. Nov 2012)

Attira hat gesagt.:


> Ich weiß, dass es so abläuft (in der Logik), aber wie gesagt, liefert es mir in Java auch für den Fall 0 0 = 1.




```
System.out.println(0 ^ 0);
```
liefert 0.


----------



## Attira (11. Nov 2012)

TKausL hat gesagt.:


> Codebeispiel?



Ich hab einen etwas längeren Code, der ein Logikrätsel lösen soll.
Es geht darum, den Dieb zu finden. Dabei gibt es drei Personen, für die gilt:

F0 Genau einer und nur einer der drei muss der Dieb sein,
F1 Wer unschuldig ist sagt auf jeden Fall die Wahrheit,
F2 b behauptet, dass a unschuldig sei und
F3 a sagt,c sei unschuldig.
Dieses Rätsel lässt sich wie folgt umschreiben:
Bedingung0:  ¬a =⇒ ¬c
Bedingung1:  ¬b =⇒ ¬a
Bedingung2:  a ^ b ^ c
Bedingung3:  (b =⇒ ¬(c ∨ a)) ∧
(c =⇒ ¬(b ∨ a)) ∧
(a =⇒ ¬(b ∨ c))

Die Methoden Beindung 0 -3 setzen die Bedingungen um.
Darunter ist auch Bedingung 2, aber für a^b^c eben nicht (denn für den Fall dass sowohl a, als auch b und c unschuldig sind liefert sie den Wert true).
Die Methode test soll testen, ob auch alle 4 Bedingungen den Wert wahr liefern 
Die Methode checkRaetsel soll die 2 hoch 3 = 8 Möglichkeiten durchgehen (also !a, !b, !c als erste, dann !a, !b, c als zweite, usw) und mit hilfe der test Methode die Lösung herausfinden (in dem Fall b). 
Sie liefert aber für zwei Konstellationen den Wert true:
1. !a, b, !c
2. a, b, c

Ersetzte ich bei bedingung 2 das a^b^c durch (b && !a && !c) || (a && !b && !c) || (c && !b && !a) komm nur noch die Lösung 1 raus. 


```
public class Riddle {

	public static boolean[][] belegt = new boolean[8][3];

	public static boolean bedingung0(boolean a, boolean b, boolean c) {

		if(implies(a, c)) {
			return true;
		}
		return false; 
	}

	public static boolean bedingung1(boolean a, boolean b, boolean c) {

		if(implies(b, a)) {
			return true;
		}
		return false; 
	}

	public static boolean bedingung2(boolean a, boolean b, boolean c) {
			
		if ((b ^ a ^ c)) {
			return true;
		}
		return false;
	}

	public static boolean bedingung3(boolean a, boolean b, boolean c) {

		if (implies(b,(!c && !a)) && implies(c,(!b && !a)) && implies(a,(!c && !b))){
			return true;
		}
		return false;

	}

	public static boolean implies(boolean d, boolean e) {

		if(!d) {
			if(!e) {
			return true;
			} 
		} if(d) {
			if(e || !e) {
			return true;
			}
		} 
		return false;
	}

	public static boolean test(boolean a, boolean b, boolean c) {


		if (bedingung0(a,b,c) && bedingung1(a,b,c) && bedingung2(a,b,c) && bedingung3(a,b,c)) {
			return true;
		}
		return false;
	}

		
	public static void checkRaetsel() {

		boolean a;
		boolean b;
		boolean c;

		for (int i = 0; i < 8; ++i) {

			a = istBitBelegt(i, 2); //"niederwertigstes bit" konvertiert auf diesen Fall => j = 2
			b = istBitBelegt(i, 1);
			c = istBitBelegt(i, 0);

                        System.out.println(String.format(
					"a: %5b; b: %5b; c: %5b  ->  %5b", 
					a, b, c, 
					test(a, b, c)));


			for (int j = 0; j<3;j++){
				if (i<7) {
					belegt[i+1][j] = belegt[i][j];
				}
			}
			if ( belegt[i][2] == false ) {
				belegt[i+1][2] = true;
			} else if (belegt[1][2] = true && i<7) {
				belegt[i+1][2] = false;
				belegt[i+1][1] = true;
			} else if(belegt[i][1] = true && i<7) {
				belegt[i+1][1] = false;
				belegt[i+1][0] = true;
			} if ( (belegt[i][2] == true) && (belegt[i][1] == true)){
				belegt[i+1][2] = false;
				belegt[i+1][1] = false;
				belegt[i+1][0] = true;
			}


		}
	}	
	
	public static boolean istBitBelegt(int bitIndex, int value) {

		if ( belegt[bitIndex][value] == true ) {
			return true;
		}
		return false;	
		

	}


	public static void main(String[] args) {



		System.out.println();
		System.out.println("Thief: ");
		checkRaetsel();
	}


}
```


----------



## JCODA (11. Nov 2012)

Naja, 

1^1^1 = (1^1)^1 = 0^1 = 1

Da stimmt schon alles.


----------



## Attira (11. Nov 2012)

JCODA hat gesagt.:


> Naja,
> 
> 1^1^1 = (1^1)^1 = 0^1 = 1
> 
> Da stimmt schon alles.



Das heißt dann wohl, dass beide Lösungen so gesehen richtig sind...der logik nach zumindest.
Danke!


----------

