Freitag, 8. Februar 2013

Darstellung negativer Zahlen: Zweierkomplement und VZB-Darstellung

Wie ein Rechner positive Zahlen darstellt kann man hier nachlesen. Ein Computer kann aber nicht nur mit positiven, sondern auch mit negativen Zahlen rechnen. Wie der Rechner diese darstellt, soll hier kurz verdeutlicht werden.

Es gibt verschiedene Möglichkeiten negative Zahlen binär darzustellen, die beiden bekanntesten sind die Vorzeichen-Betrags-Darstellung und das Zweierkomplement. Das am häufigsten verwendete Verfahren ist jedoch die Darstellung als Zweierkomplement. Dennoch werde ich hier beide Verfahren vorstellen.

Anmerkung: 
Ich werde die Binärzahlen in diesen Beispielen zur Veranschaulichung mit lediglich 4 Stellen angeben. Natürlich schaut dies in der Praxis anders aus. Das Prinzip bleibt aber das selbe.

VZB-Darstellung
Möchte man beispielsweise die Zahl -7 in VZB-Darstellung repräsentieren, so muss man zunächst ihren Betrag, also +7, im Binärsystem darstellen, also 0111. Die VZB-Regel besagt, dass das erste Bit bei positiven Zahlen 0 und bei negativen Zahlen 1 sein soll. Da -7 offensichtlich negativ ist muss hier das erste Bit auf 1 gesetzt werden, also ist -7 in VZB-Darstellung 1111.

Schritt für Schritt:
1) -7     | Betrag berechnen
2)  7     | Binär darstellen
3) 0111   | erstes Bit auf 1 setzen
4) 1111   | fertig!

Zweierkomplement-Darstellung
Auch hier sei als Beispiel wieder die Zahl -7 gewählt. Möchte man diese als Zweierkomplement darstellen, so muss man zunächst ebenfalls den Betrag im Binärsystem hinschreiben. Nun muss man jedoch alle Bits invertieren, das bedeutet, aus 1 wird 0 und aus 0 wird 1. Bei -7 würde aus 0111 demnach 1000 werden. Danach ist man jedoch noch nicht fertig, zum Schluss wird nämlich noch binär eine 1 addiert. -7 in Zweierkomplement-Darstellung ist also 1001.

Schritt für Schritt:
1) -7     | Betrag berechnen
2)  7     | Binär darstellen
3) 0111   | invertieren
4) 1000   | 1 addieren
5) 1001   | fertig!

Donnerstag, 31. Januar 2013

CHM-Dateien unter Linux mit Wine öffnen

Unter Linux gibt es verschiedene Möglichkeiten CHM-Dateien auch ohne Wine zu öffnen, wie z.B. chmsee. Wenn man jedoch ohnehin Wine nutzt, ist es eigentlich unnötig sich zusätzliche Software zu installieren, da Wine ohne Probleme mit diesen Dateien umgehen kann. Leider kann man die Datei nicht per Rechtsklick->"Mit hh öffnen" (hh ist das Programm zum Öffnen von chm-Dateien unter Windows) öffnen, wie der folgende Screenshot zeigt.


Dies heißt jedoch nicht, dass Wine keine chm's öffnen kann. Man muss lediglich diesen Code ins Terminal eingeben und schon wird die chm problemlos geöffnet:

wine hh.exe `winepath -w /Verzeichnis/Datei.chm`

Das Kommando winepath -w konvertiert den Linux-Verzeichnispfad in einen Windowspfad. Dadurch kann die chm-Datei von dem Programm hh erkannt und ausgeführt werden.

Samstag, 26. Januar 2013

Frogger - An unexpected Journey

Heute stelle ich euch mein erstes "größeres" Projekt vor. Im Rahmen meines Studiums musste ich eine Variante des altbekannten Spiels "Frogger" in Java zusammen mit der Game-Library Slick2D programmieren. Diese ist nun fertig und ich möchte sie euch natürlich nicht vorenthalten. Das Spiel hat einen Singleplayer- und sogar einen Multiplayer-Modus mit jeweils vier verschiedenen Leveln.
Unten findet ihr die Downloads für Windows, Linux, Mac und Solaris, sowie den Java Sourcecode. Solltet ihr Probleme oder Fragen zum Spiel haben, könnt ihr mir gerne eine E-Mail schreiben oder die Frage in den Kommentaren stellen. Ich werde sie selbstverständlich so schnell wie möglich versuchen zu beantworten.
Hier ein Screenshot des ersten Levels:


Ich hoffe das Spiel gefällt euch und bin für euer Feedback sehr dankbar. Viel Spass beim Zocken!

Downloads:


Mittwoch, 31. Oktober 2012

Prä- und Postfix Inkremente bzw. Dekremente

Da es bei diesem Thema häufig zu Missverständnissen kommt, sei hier nur kurz erklärt wo der Unterschied zwischen dem Prä- und dem Postfix Inkrement bzw. Dekrement liegt.

Der Unterschied ist nicht, dass a++ -> a=a+1 bzw a-- -> a=a-1 und ++a -> a=1+a bzw --a -> a=1-a. Diese Annahme fürt vor Allem bei --a häufig zu Fehlern.

Sowohl a++ / a-- und ++a /--a addieren bzw. subtrahieren den Wert 1 zu / von a.
Sprich --a -> a=a-1 und nicht 1-a!

Der große Unterschied ist jedoch, dass prä-Inkremente / Dekremente sofort der Variablen zugewisen werden und post-inkrementierte / dekrementierte Variablen erst nach der nächsten Verwendung um 1 erhöht werden.

Beispielcode in C++

01: int i = 1;
02: cout << ++i << endl;
03: cout << i++ << endl;
04: cout << ++i << endl; 

Beispielcode Java

01: int i = 1;
02: System.put.println(++i);
03: System.put.println(i++);
04: System.put.println(++i);

Ausgabe:
2
2
4

Montag, 27. August 2012

Verzweigen mit switch und case

Wie im letzten Beitrag geht es auch nun wieder um Verzweigungen innerhalb eines Programms. Diesmal werde ich euch eine Alternative zu if, else und else if vorstellen. Es handelt sich dabei, welch Überraschung, um switch und case. Diese Methode macht meist dann Sinn, wenn man sehr viele Bedingungen hintereinander prüfen will, da dadurch der Schreibaufwand verringert wird. Nun kommt aber wie immer erst der Code und danach die Erklärung.
01: #include <iostream>
02: 
03: using namespace std;
04:
05: int main()
06: {
07:     //Steuerung mit den Tasten 'W', 'S', 'A' und 'D' realisieren
08:     char chTaste;
09:
10:     switch (chTaste)
11:     {
12:       case ('w'):
13:       {
14:         cout << "Spieler geht vorwärts.\n";
15:       } break;
16:       case ('s'):
17:       {
18:         cout << "Spieler geht rückwärts.\n";
19:       } break;
20:       case ('a'):
21:       {
22:         cout << "Spieler geht nach links.\n";
23:       } break;
24:       case ('d'):
25:       {
26:         cout << "Spieler geht nach rechts.\n";
27:       } break;
28:       default:
29:       {
30:         cout << "Falsche Eingabe!\n"
31:       }
32:     }
33:
34:     //Nach dem break geht es hier weiter
35:     system("pause");
36:
37:     return 0;
38: }
Dieses Programm soll zeigen, wie in einem Spiel die Steuerung mit der Tastatur realisiert werden kann. Natürlich ist dieser Code in einem richtigen Spiel nicht zu gebrauchen, da hier lediglich eine Meldung ausgegeben wird, wenn eine Bedingung zutrifft, aber in diesem Beispiel geht es auch in erster Linie um die switch und case-Bedingung und nicht um die Steuerung in einem Spiel.

Um switch und case benutzen zu können muss man sich zunächst eine Variable erstellen, die geprüft werden soll, in diesem Beispiel 'chTaste'. Diese schreibt man nun in runden Klammern hinter die switch-Anweisung. Danach folgt ein Block aus case-Anweisungen, die Bedingung wird ebenfalls in runden Klammern hinter das Schlüsselwort case gesetzt. Hier ist jedoch darauf hinzuweisen, dass die Bedingung hinter dem case nicht wie bei einer if-Bedingung nicht zwangsläufig in Klammern stehen muss. Hinter der Bedingung folgt dann noch ein Doppelpunkt, der die Bedingung abschliesst. Trifft eine Bedingung zu, z.B. beim drücken der Taste W, so wird der darunterstehende Code ausgeführt. Folgt, wie in diesem Beispiel ein break, so werden alle weiteren case-Anweisungen übersprungen und nach dem switch-case-Block fortgefahren. Jedoch kann es auch vorkommen, dass man sich vertippt und anstallt W die Taste E drückt, in diesem Fall kommt die default-Anweisung ins Spiel. Diese ersetzt sozusagen das Schlüsselwort else aus dem vorherigen Beitrag. In einem switch-case-Block kümmert sich das default also um alle anderen Eingaben oder Bedingungen, die man in seinem Programm nicht benötigt.