title image


Smiley Re: Bitweise Operatoren
Hi



>1.) Ist es auch möglich mit & bzw. | Additionen oder Subtraktionen von zwei Integerzahlen durchzuführen, also lediglich bitweise Operatoren zu verwenden statt dir üblichen Operatoren + und - ???



Unter bestimmten Bedingungen: Ja. (Ob das sinnvoll ist, muß man im Einzelfall selbst entscheiden...). Überlege dir dazu, was das Bitmuster einer Zahl bedeutet:



100110 = 32 + 4 + 2 = 38



Wenn du zu dieser Zahl nun z.B. 8 dazuaddierst, kommt 46 raus:



101110 = 32 + 8 + 4 + 2 = 46



Wie du siehst, kam beim Bitmuster nur die "1" an der 8er-Stelle dazu. Man könnte diese Addition also schreiben als

38 | 8 = 46

100110 | 001000 = 101110





Wenn du nun z.B. die 4 davon abziehen willst, kommt 42 raus:



101010 = 32 + 8 + 2 = 42



Dort wurde nur die "1" an der 4er-Stelle weggenommen. Also kann man diese "Subtraktion" schreiben als



46 & ~4 = 42

101110 & ~000100 =

101110 & 111011 = 101010



Allgemein sind die Bedingungen wie folgt:



x | y == x + y wenn x & y == 0

x & ~y == x - y wenn x & y == y



(falls ich mich da jetzt nicht vertan habe...)











>2.)

Wer kann mir darüber hinaus die grundsätzlichen Einsatzmöglichkeiten der bitweisen Operatoren erklären (auch Kombinationsmöglichkeiten) ???





Die Bereiche, in denen sie eingesetzt werden können sind vielfältig, z.B. für Flags:



// Eigenschaften als einzelne Bits festlegen

#define MANN (1<<0)

#define FRAU (1<<1)

#define KIND (1<<2)

#define MENSCH (MANN | FRAU | KIND)

#define ALT (1<<3)

#define JUNG (1<<4)



...

int typ = FRAU | JUNG; // Eigenschaften in einer Variablen kombinieren



if (typ & MENSCH) { /* ist bei MANN, FRAU und KIND erfüllt - egal ob sie zusätzlich noch ALT oder JUNG sind */ }



typ &= ~JUNG; // nichtmehr JUNG

typ |= ALT; // sondern ALT



Das ist also eine sehr kompake Möglichkeit, viele Informationen in einer einzigen (32 bit) Variabeln unterzubringen - stell dir vor, wie aufwändig es wäre, dafür 32 bool's zu verwenden! Die Abfragen würden scheußlich aussehen:



bool eigenschaften[32];

eigenschaften[1] = true; // Eine Junge Frau -

eigenschaften[4] = true; // aber woran sieht man das?



if (eigenschaften[0] || eigenschaften[1] || eigenschaften[2]) { /* dann ist es ein Mensch */ }



(*Schauder*)







Ein anderer Bereich, in dem diese Operatoren gerne eingesetzt werden, ist zum Beispiel(!!!) bei den Farbcodierungen im Bereich der Computergraphik: Die Farbe eines Pixels ist dort über Rot, Grün und Blau-Anteile gegeben, die alle zusammen in einer 32bit-Variabeln stehen. Um diese zu erstellen (oder die einzelnen Farbanteile nachher wieder rauszuziehen) verwendet man die Bitoperationen:



int r = 123; // rot-Anteil

int g = 43; // grün-Anteil

int b = 12; // blau-Anteil



// Pixelfarbe aus 3 Farbkomponenten erstellen

int pixel = ((b<<16) | (g<<8) | r);



// Farbkomponenten wieder auslesen

r = pixel & 0xFF;

g = (pixel>>8) & 0xFF;

b = (pixel>>16) & 0xFF;





Aber das sind nur Beispiele - der Phantasie für den Einsatz sind keine Grenzen gesetzt :-)



Ich hoffe, das hat dich inspiriert ;-)



bye

















geschrieben von

Login

E-Mail:
  

Passwort:
  

Beitrag anfügen

Symbol:
 
 
 
 
 
 
 
 
 
 
 
 
 

Überschrift: