Einzelnen Beitrag anzeigen

Frickeldrecktuxer_TM
(Gast)

n/a Beiträge
 
#7

Re: Zugehörigkeitsoperator in C++ ?

  Alt 24. Mai 2006, 13:00
Zitat von PAX:
ähm, da seh ich gerade überhaupt nicht durch
...
Das ist eigentlich nichts fortgeschrittenes und hat auch nichts mit Klassen oder ähnlichem zu tun. Im Prinzip ist es einfache Mathematik.
Zahlen werden im Computer als Reihe von Bits (0 oder 1) gespeichert. Deswegen kann man prima einen long int als Bitfeld missbrauchen, weil er 32 (64) Bits enthält, über die man natürlich frei verfügen kann.
Wenn ich jetzt
Code:
const SS_SECOND = 1 << 1;
definiere, habe ich eine 1, die ich einmal nicht links verschiebe. Binär wäre eine Eins 00000001, eine Eins, die einmal nach links verschoben ist wäre 00000010.
Für die Operationen nimmt man dann einfach die Operatoren aus der Logik, die bei C & (AND), | (OR), ^ (XOR) und ~ (NOT) lauten. In C habe ich zusätzlich die Möglichkeit, gleich eine Zuweisung durchzuführen, indem ich ein "=" hinter den Operator setze, aber das schaust du dir am besten in einem C-Grundlagenbuch an.
In C prüft eine if()-Abfrage nicht, ob etwas TRUE ist, sondern ob etwas !FALSE (nicht FALSE) ist, wobei FALSE den Wert 0 hat. if(42) wird also genauso ausgeführt, wie if(1), if(-1) oder if(TRUE). Das kann man sich dann bei Bitfeldern zunutze machen.
Nehmen wir das Bitfeld 00001001. Nach obigem Schema mit den Konstanten wäre SS_FIRST und SS_FOURTH im "Set". Jetzt ANDe ich SS_FOURTH mit diesem Set. 00001000 AND 00001001 ergibt 00001000, dezimal 8. if(8) wird ausgeführt. Ein solches AND kann ich also benutzen, um zu überprüfen, ob ein Element in meinem "Set" ist, denn umgekehrt wäre 00001001 AND 00000100 "nur" 00000000, dezimal 0, und if(0) ist genauso wie if(FALSE).
Umgekehrt kann ich das OR dazu benutzen, neue Werte in mein "Set" aufzunehmen, unabhängig davon, ob sie bereits im "Set" enthalten sind, oder nicht.
Für solche logischen Operationen gibt es Tabellen, wenn dir das für den Anfang etwas verwirrend erscheint, im Grunde ist es aber alles ganz einfach.


Zu deinem anderen Problem hat dir Flocke schon geholfen. Ein beliebter Anfängerfehler (gerade von Quereinsteigern aus anderen Sprache) ist es, das break bei switch()-Blöcken zu vergessen und sich dann über unerwartetes Verhalten zu wundern. Du musst also auch hinter jedem case-Zweig, den du für abgeschlossen hältst, ein break einfügen, damit nicht alle weiteren case-Zweige abgearbeitet werden.

Zitat von PAX:
mich würde desweiteren auch noch etwas persönliches von dir interessieren:
wie hast du dir dieses ganze wissen angeeignet? in welchen jahren (und wo) hast du am meisten gelernt?
In meinen besten
Das ganze Wissen habe ich mir mehr oder weniger "nebenbei" (neben der Schule) angeeignet, und zwar autodidaktisch. Angefangen habe ich wie viele mit BASIC unter DOS, später unter Windows mit Delphi und nun bin ich bei C++ angelangt, weil mir C++ einfacher und flexibler erscheint als Delphi (okay, und weil es unter Linux kein Delphi-Äquivalent gibt ). Neue Sprachen erschließe ich mir, indem ich die Sprachreferenzen lese. Dabei erschließt sich auch meistens der Sinn von Dingen, die in anderen Sprachen nicht möglich sind. Templates, Multiple Inheritance oder Namespaces sind etwas, was es in Delphi nicht gibt, für die sich (zumindest für mich) der Sinn aber mehr oder weniger von selber erschließt, wenn man sich die Definitionen dafür anschaut. Der Rest ist learning by doing und Lesen von Code-Beispielen, Bibliotheksdokumentationen und Rumprobieren mit bestimmten Aufrufen oder Bibliotheken.
Ich denke, am meisten habe ich in den zwei Jahren gelernt, in denen ich mit Delphi gearbeitet habe, nämlich modernes (objektorientiertes) Programmieren und wie moderne Betriebssysteme implementiert sind. Dann habe ich mich immer mehr für C++ interessiert, weil ich die Syntax sehr viel einfacher finde und mit dem Komplettumstieg auf Linux kam dann auch der Komplettumstieg auf C++. Ich hätte genauso gut von Anfang an C++ machen können und hätte dann wahrscheinlich das gleiche gelernt, ich denke es hängt also damit zusammen, daß ich mich in dieser Zeit am meisten dafür interessiert habe.
  Mit Zitat antworten Zitat