# Klausur-Übung



## Thrawns (13. Jul 2009)

Hallo,
bald steht die Klausur an, bzw. eher der Test. Denn wie man an den Fragen sieht, geht es da teilweise echt um Grundlagen. Habe nämlich zu bestimmten Operatoren noch Fragen. Die Lösungen, die wir bekommen haben, steht in den eckigen Klammern und sind folglich nicht von mir.

Davon ausgehend, dass *a=2; b=3; c=4*, wieso ergibt ...
... *b << a*     [12] (irgendwas wird nach links verschoben; binär? wie genau funktioniert das Schieben?)
... *b*c%a*     [0] (3*4 = 12 und geteilt durch 2 geht glatt -> % heißt Rest, also 0!?)
... *a&b*     [2] (werde ich leider gar nicht schlau draus - "und")
...* a^b*     [1] (werde ich leider auch nicht schlau draus - "exklusives Oder")
... *c/b*     [1] (4 durch 3, ergibt eigentlich 1,333... wenn man Gleitkomma ausgeben will, muss man es irgendwie anders schreiben, richtig? c/b.0 oder in der Art?)

So, das sind erstmal meine Fragen/Anmerkungen. Also wie die Operatoren heißen ist nicht das Problem, eher bei manchen, was genau sie machen.


----------



## Der Müde Joe (13. Jul 2009)

b << a [12]:
Java Quick Reference - Operators and Assignments - Shift Operators
JAVA: 3.3.3 Verschiebe-Operatoren

b*c%a:
% = Modulo..(Rest) also richtig

a&b:
Bitweises AND
1101
0101
-----
0101

a^b:
Bitweises XOR
1100
1010
-----
0110

c/b:
Java benutz per default Integer (int)
daraum:
4/3 = 1
5/2 = 2
5d/2 = 2.5 (double) (kann auch in die Hose gehen: halt 
What Every Computer Scientist Should Know About Floating-Point Arithmetic


----------



## Thrawns (13. Jul 2009)

Der Müde Joe hat gesagt.:


> a&b:
> Bitweises AND
> *1101
> 0101*
> ...



Mir ist nicht klar, wie du auf die fett markierten binär-Zahlen kommst. :rtfm:


----------



## Gastredner (13. Jul 2009)

Umrechnen von Dezimal- in Binärzahlen habt ihr aber durchgenommen, oder?
Ansonsten: Jede Ziffer einer Binärzahl steht, von Rechts ausgehend, für eine Zweierpotenz. Es startet mit 2^0, also 1, und geht dann immer weiter. 2^1, 2^2, 2^3, et cetera.
Du nimmst dir also die größe Zweierpotenz, die in der gegebenen Dezimalzahl vorkommst, markierst ihre Stelle in der Binärzahl mit einer 1, subtrahierst ihren Dezimalwert von deiner Dezimalzahl und nimmst dann die nächsttiefere Zweierpotenz. Passt diese in die Dezimalzahl, wird sie wiederum subtrahiert und ihre Stelle mit einer 1 markiert. Passt sie nciht, markierst du ihre Stelle mit einer 0 und machst mit der nächsttieferen weiter. Und so weiter...

Eine gute Übersicht über alle Zahlensysteme in der Infomatik inklusive Umrechnungsverfahren gibt hier: Galileo Computing :: IT-Handbuch fuer Fachinformatiker – 2.2 Informationsspeicherung im Computer

EDIT: Entschuldige, erst übersehen - die Zahlen vom müden Joe scheinen Beispielzahlen ohne Aufgabenhintergrund zu sein. Ansonsten müsste a=2 ja 10 und b=3 ja 11 entsprechen.


----------



## Der Müde Joe (14. Jul 2009)

>die Zahlen vom müden Joe scheinen Beispielzahlen ohne Aufgabenhintergrund zu sein

Jaein. Sind einfach die 4 Möglichkeiten, den ensprechenden Operator anzuwenden (wobei AND leicht in die Hose ging)


----------



## Thrawns (20. Jul 2009)

Ok, danke. Ich glaube ich habe es dann was das betrifft. Schreibe das noch mal haarklein auf. Wenn jemand einen Fehler findet, bitte schreien. Denke aber, das stimmt - aber aufschreiben hilft ja meistens. 

_a=2; b=3; c=4_

*a&b = 2, weil:*
a ist als Binärzahl 10, b ist als Binärzahl 11.
10
11
---
10 (was als Dezimalzahl geschrieben eben 2 ergibt). AND = wenn beide Operanden true (1) sind, kommt eine 1 hin - wenn nur ein Operand oder gar kein Operand 1 ist, kommt eine 0 hin.


*a^b = 1, weil:*
a ist als Binärzahl 10, b ist als Binärzahl 11.
10
11
---
01 (was als Dezimalzahl geschrieben eben 1 ergibt). XOR = wenn genau ein(!) Operand true (1) ist, kommt eine 1 hin - wenn mehr als ein Operand oder kein Operand 1 ist, kommt eine 0 hin.

**************************************************************

Dann habe ich noch mal zwei grundsätzliche Fragen:
1) Macht es einen Unterschied, ob man den Operator einmal oder zwei mal schreibt? Teilweise lese ich von & oder auch &&. Oder aber | oder || (oder oder oder oder ... verrückt ;P). Einen Unterschied sehe ich da aber irgendwie nicht.
Ok, das hat sich erledigt: bei den Doppelzeichen wird ggf. die Aktion abgebrochen, wenn nach dem ersten Operanden schon klar ist, was für ein Ergebnis rauskommt. Der zweite Operand wird gar nicht mehr geprüft.
2) Gehe ich recht in der Annahme, dass man aber mehrere Operanden kombinieren kann? Also z.B. 2&3&4 oder auch 5|6|7|8?


----------



## Thrawns (20. Jul 2009)

Übrigens möchte ich mich an dieser Stelle mal bedanken, dass hier immer wieder User, die längst zig Level über diesem Niveau sind, sich noch die Mühe machen einem zu helfen. Und zwar ohne die Lösung auf dem Silbertablett zu servieren, sondern versuchen dabei zu helfen die Sache wirklich zu verstehen.


----------



## Gastredner (20. Jul 2009)

Thrawns hat gesagt.:


> 1) Macht es einen Unterschied, ob man den Operator einmal oder zwei mal schreibt? Teilweise lese ich von & oder auch &&. Oder aber | oder || (oder oder oder oder ... verrückt ;P). Einen Unterschied sehe ich da aber irgendwie nicht.


Doch, da ist ein Unterschied.
Die "doppelten" Operatoren && und || operieren nicht auf Bitebene wie & und |. Stattdessen ist es mit ihnen möglich, boolsche Werte zu kombinieren. So ergibt "true && true" also "true", während "true && false" "false" ergibt. Dabei ist allerdings darauf zu achten, dass || kein _exklusives_ Oder ist.
Eingesetzt werden diese Operatoren daher z. B. in Schleifen oder Verzweigungen:

```
while ((i > 0) && (i < 5)) {
if (i == 1 || i == 4) {
//hier passiert was
}
}
```



> 2) Gehe ich recht in der Annahme, dass man aber mehrere Operanden kombinieren kann? Also z.B. 2&3&4 oder auch 5|6|7|8?


Ja, die Operatoren lassen sich kombinieren. Ich bin grad nicht ganz sicher, aber sie müssten eigentlich von rechts nach links her abgearbeitet werden.


----------



## Schandro (20. Jul 2009)

& und | sind AUCH logische Operatoren (und gleichzeitig Bitoperatoren, je nachdem in welchen Zusammenhang sie genutzt werden).

Sie unterscheiden sich von && und || nur hierdurch:
Bei | bzw. & werden beide Ausdrücke IMMER ausgewertet, selbst wenn der zweite Ausdruck keinen Unterschied am Ergebnis mehr machen würde.
Beispielcode:

```
class A{
	public static void main(String[] args){
		System.out.println(true || giveBooleanAndLog());
		System.out.println(false && giveBooleanAndLog());

		System.out.println();

		System.out.println(true | giveBooleanAndLog());
		System.out.println(false & giveBooleanAndLog());
	}

	public static boolean giveBooleanAndLog(){
		System.out.println("method giveBooleanAndLog");
		return true;
	}
}
```

Nur bei | bzw. & wird die Methode giveBooleanAndLog aufgerufen, || und && verzichten auf den unnötigen Aufruf, da er nix am Ergebnis ändern wird, egal wie das resultat ist.


----------



## Gastredner (20. Jul 2009)

Okay, danke für die Klarstellung.


----------

